在 python 中生成 YAML ansible 清单

produce a YAML ansible inventory in python

我想从 python 脚本编写一个 YAML ansible 清单文件。 ansible 的预期格式似乎只包含密钥对,每个主机的末尾都有一个冒号,前面没有冒号,例如:

pe:
  hosts:
      host1:
      host2:
      host3:
      host4:

我在 python 中创建了一个这样的结构:

inventory_struct = {
    'pe': {
        'hosts': [],
    },
}

我正在 'hosts' 列表中添加主机。但是当我写清单文件时:

yaml.dump(inventory_struct, outfile, default_flow_style=False, allow_unicode=True)

我得到了 ansible 无法识别的格式:

pe:
   -hosts:
    - host1
    - host2
    - host3

当我 运行 此清单上的剧本时出现错误消息:

Attempted to read "../inventories/inv-xyz555" as YAML: list indices must be integers, not AnsibleUnicode

有没有办法以预期的 YAML 格式转储结构?

谢谢,

邦迪男孩

我用主机字典替换了主机列表,我的主机作为键,None 作为值,似乎可以解决问题。我得到一个如下所示的清单文件:

pe:
  hosts:
    host1: null
    host2: null
    host2: null

Ansible 似乎没有抱怨 null。

这主要是为了让您的 Python 字典正确,而不是关于 YAML。 YAML 将列表项表示为带有 - 前缀的值,将对象(字典)键表示为后面带有 : 的字符串。

我想你要找的是这样的:

inventory_struct = {
    'pe': {
        'hosts': {
            'host1': '',
            'host2': '',
            'host3': '',
        },
    },
}

只需使用替换来删除空字符串。 例如: print(yaml.dump(inventory_struct, default_flow_style=False).replace('null', ''))

您可以执行类似于

的操作
import yaml

def inventory():

  ip_list = {}
  ip_list['10.25.152.200'] = None
  ip_list['10.25.152.201'] = None

  inventory = dict(all = dict (
    children = dict(
      qa = dict(
        hosts = ip_list,
        vars = dict(
            ansible_ssh_user = 'foo',
            ansible_ssh_pass = 'bar'
          )
        )
      )
    )
  )

  return inventory

def main():
  with open('/tmp/inventory.yml', 'w') as outfile:
    yaml.dump(inventory(), outfile, default_flow_style=False)

if __name__ == "__main__":
    main()