这是我的YAML
文件:
hosts: all
gather_facts: no
remote_user: ubuntu
name: install latest nginx
tasks:
- name: install the nginx key
apt_key:
url: http://nginx.org/keys/nginx_signing.key
state: present
become: yes
- name: install aws cli
command: pip3 install awscli
become: yes
这是我的go代码:
package main
import (
"github.com/davecgh/go-spew/spew"
"gopkg.in/yaml.v2"
"io/ioutil"
)
type Config struct {
Hosts string `yaml:hosts`
Gather_facts string `yaml:gatherfacts`
Remote_user string `yaml:remoteuser`
Name string `yaml:names`
Tasks []map[string]string `yaml:tasks`
}
func main() {
file, err := ioutil.ReadFile("/path-to-nginx1.yml")
if err != nil {
panic(err)
}
var config Config
yaml.Unmarshal(file, &config)
spew.Dump(config)
}
这是输出:
(main.Config) {
Hosts: (string) (len=3) "all",
Gather_facts: (string) (len=2) "no",
Remote_user: (string) (len=6) "ubuntu",
Name: (string) (len=20) "install latest nginx",
Tasks: ([]map[string]string) (len=2 cap=2) {
(map[string]string) (len=2) {
(string) (len=6) "become": (string) (len=3) "yes",
(string) (len=4) "name": (string) (len=21) "install the nginx key"
},
(map[string]string) (len=3) {
(string) (len=4) "name": (string) (len=15) "install aws cli",
(string) (len=7) "command": (string) (len=19) "pip3 install awscli",
(string) (len=6) "become": (string) (len=3) "yes"
}
}
}
问题:如何从YAML中检索以下密钥?
apt_key:
url: http://nginx.org/keys/nginx_signing.key
state: present
目前,我的Go解析器完全忽略了输出中的上述键。
此外,我有很多YAML文件,其中包含不同程度的嵌套。然后大多数在文件本身内具有不同程度的嵌套。那么我的struct
是否需要修改才能解决每个单独的密钥?或者,处理每个密钥具有不同嵌套级别的YAML
文件的更好go方法是什么?
>>>更新<<< :
我通过修改Tasks
内的struct
如下所示取得了一些进展:
type Config struct {
Hosts string `yaml:hosts`
Gather_facts string `yaml:gatherfacts`
Remote_user string `yaml:remoteuser`
Name string `yaml:names`
Tasks []struct {
Name string `yaml:name`
Apt_key struct {
Url string `yaml:url`
State string `yaml:url`
} `yaml:apt_key`
Become string `yaml:become`
}
}
输出:
(main.Config) {
Hosts: (string) (len=3) "all",
Gather_facts: (string) (len=2) "no",
Remote_user: (string) (len=6) "ubuntu",
Name: (string) (len=20) "install latest nginx",
Tasks: ([]struct { Name string "yaml:name"; Apt_key struct { Url string "yaml:url"; State string "yaml:url" } "yaml:apt_key"; Become string "yaml:become" }) (len=2 cap=2) {
(struct { Name string "yaml:name"; Apt_key struct { Url string "yaml:url"; State string "yaml:url" } "yaml:apt_key"; Become string "yaml:become" }) {
Name: (string) (len=21) "install the nginx key",
Apt_key: (struct { Url string "yaml:url"; State string "yaml:url" }) {
Url: (string) (len=39) "http://nginx.org/keys/nginx_signing.key",
State: (string) (len=7) "present"
},
Become: (string) (len=3) "yes"
},
(struct { Name string "yaml:name"; Apt_key struct { Url string "yaml:url"; State string "yaml:url" } "yaml:apt_key"; Become string "yaml:become" }) {
Name: (string) (len=15) "install aws cli",
Apt_key: (struct { Url string "yaml:url"; State string "yaml:url" }) {
Url: (string) "",
State: (string) ""
},
Become: (string) (len=3) "yes"
}
}
}
所以现在我可以看到之前完全丢失的apt_key
部分。
但是,我没有找到以YAML编写的command
部分:
command: pip3 install awscli
我如何得到它?
另外,我不会感觉很好,因为我必须在struct
中声明几乎所有的键,在这种情况下这是正常的,因为我的YAML
几乎不是15行。但如果YAML
更大更长,这将是丑陋和繁琐的。
我确信在go中必须有一种更好,更有效的方式来处理YAML
个文件。
答案 0 :(得分:1)
看起来你已经完成了所有事情,你只是错过了Config结构定义中的Command部分。我看到其他答案指出你有不一致的数据,它是正确的,但你可以在同一个结构中获取它们,如果yaml文件中缺少字段,那么缺少的字段将是空的。
"test"
答案 1 :(得分:1)
它无法正常工作,因为您正在尝试解组两个不同的集合:name,apt-key,become和name,command,变得使用相同的struct。这是不一致的。