在 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()
我想从 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()