将结构转换为YAML文件golang,在编组时遇到问题

问题描述 投票:0回答:1

我正在尝试使用struct产生以下YAML,

预期输出:

all:
  hosts:
  children:
    master:
      hosts:
// This is dynamic data coming from the slice.
        192.168.99.123:
        192.168.99.125:
    worker:
      hosts:
        192.168.99.123:
        192.168.99.125:
    etcd:
      hosts:
        192.168.99.123:
        192.168.99.125:
  vars:
    ansible_user: vagrant
    ansible_ssh_private_key_file: "~/.ssh/id_rsa"

我的golang结构如下,

type Inventory struct {
    All *AnsibleInventory `json:"all"`
}

// AnsibleInventory defines ansible inventory file struct
type AnsibleInventory struct {
    Hosts    string     `json:"hosts"`
    Children *HostGroup `json:"children"`
    Vars     *Vars      `json:"vars"`
}

type HostGroup struct {
    Master *Hosts `json:"master"`
    Worker *Hosts `json:"worker"`
    Etcd   *Hosts `json:"etcd"`
}

type Hosts struct {
    Hosts map[string]string `json:"hosts,omitempty"`
}

type Vars struct {
    User              string `json:"ansible_user"`
    SshPrivateKeyFile string `json:"ansible_ssh_private_key_file"`
}

我正在如下初始化结构,

    elementMap := make(map[string]string)
    for _, ip := range p.MasterIPs {
        elementMap[ip] = "" // I tried using slice this is definitely not expected 
    }

    ansibleInventory := &Inventory{
        &AnsibleInventory{Children: &HostGroup{
            Master: &Hosts{
                elementMap,
            },
            Worker: &Hosts{
                elementMap,
            },
            Etcd: &Hosts{
                elementMap,
            },
        }, Vars: &Vars{
            User:              p.Username,
            SshPrivateKeyFile: p.PrivateKeyPath,
        }}}

      b, err := yaml.Marshal(ansibleInventory)

      filename:= "/tmp/filename"

    _, err = os.OpenFile(filename, os.O_CREATE|os.O_WRONLY, 0644)
    err = ioutil.WriteFile(filename, b, 0644)

产生的输出看起来像这样,

all:
  children:
    etcd:
      hosts:
        192.168.99.123: ""
        192.168.99.125: ""
    master:
      hosts:
        192.168.99.123: ""
        192.168.99.125: ""
    worker:
      hosts:
        192.168.99.123: ""
        192.168.99.125: ""
  hosts: ""
  vars:
    ansible_ssh_private_key_file: ~/.ssh/id_rsa
    ansible_user: vagrant
go struct
1个回答
1
投票

您需要在每个结构中指定yaml标签而不是json

type Inventory struct {
    All *AnsibleInventory `yaml:"all"` // not `json:"all"`
}
© www.soinside.com 2019 - 2024. All rights reserved.