我目前正在尝试编写一些内容来将Ansible库存文件转换为JSON数组,这样可以将其转换为awx / tower但是我一直在努力从当前的库存文件格式构建一个全新的数组。我避免使用任何Ansible python API模块,因为无法保证未来的更新不会破坏这些。我找到的一个解决方案不再有效,因为Ansible InventoryParser python模块似乎有了变化,所以我试图想出一个Python 2.7解决方案。
示例清单文件;
[test]
host1
host2
[test1]
host3
host4
[]表示组,其他条目是将成为键:值关系的主机。我已经将它转换为python中的列表,然后我尝试将其格式化为一个键:值设置使用[]作为从值中拆分键的位置。
both = []
f = open(filename, "r")
line = f.readline().strip()
while line:
both.append(line)
line = f.readline().strip()
f.close()
start = '['
end = ']'
json_dict = {'all': [dict(item.split(start)[1].split(end)[0] for item in
both)]}
print json.dumps(json_dict)
不幸的是,这会返回错误: ValueError:字典更新序列元素#0的长度为4; 2是必需的
虽然说实话但我不确定这会回归我想要的东西。
希望有人可以指出我正确的方向或突出我到目前为止出错的地方。
干杯
编辑:为实际预期的输出添加一些代码;
{
[test]: {
'hosts': ['host1', 'host2'],
},
[test1]: {
'hosts': ['host3', 'host4'],
}
}
我正在努力实现的更详细的输出示例;
{
"databases" : {
"hosts" : [ "host1.example.com", "host2.example.com" ],
"vars" : {
"a" : true
}
},
"webservers" : [ "host2.example.com", "host3.example.com" ],
"atlanta" : {
"hosts" : [ "host1.example.com", "host4.example.com",
"host5.example.com" ],
"vars" : {
"b" : false
},
},
"marietta" : [ "host6.example.com" ],
"5points" : [ "host7.example.com" ]
}
因此,我们有一个保存组名的密钥,其中包含主机和变量的密钥:值对。
经过一些研究后,我更接近我想要的输出,使用以下代码;
both = {}
group = None
with open(filename, "r") as f:
line = f.readline().strip()
while line:
if line.startswith('#') or line.startswith(';') or len(line) == 0:
continue
if line.startswith("["):
# is a group
group = line
both[group] = {}
elif not line.startswith("["):
host = line
both[group][host] = {}
line = f.readline().strip()
f.close()
return both
返回以下内容并不是我所追求的,但我觉得我正在取得进展;
{
"[test2]": {
"host1": {},
"host2": {}
},
"[test3]": {
"host3": {}
},
"[test]": {
"host4": {},
"host5": {}
}
}
答案 0 :(得分:1)
它可以帮到你。
import json
both = {}
start = '['
end = ']'
with open(filename, "r") as f:
line = f.readline().strip()
while line:
if start in line or end in line:
line = line.split(start)[1].split(end)[0]
both[line] = line
line = f.readline().strip()
json_dict = {'all': [both]}
print(json.dumps(json_dict))