我目前正在尝试编写一些东西来将Ansible库存文件转换为JSON数组,这样就可以将其拉入awx/tower,但是我一直在努力从当前库存文件格式构建一个全新的数组。我避免使用任何可移植的python API模块,因为不能保证将来的更新不会破坏这些模块。我发现的一个解决方案已经不起作用了,因为Ansible InventoryParser python模块似乎发生了变化,所以我试图提出一个python 2.7解决方案。
库存文件示例
[test]
host1
host2
[test1]
host3
host4
[]表示组,其他条目是将成为键:值关系的主机。我已经在python中将其转换为一个列表,然后尝试将其格式化为key:value设置,使用[]作为从值中拆分键的位置。
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)
很遗憾,这将返回错误: 值错误:字典更新序列元素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": {}
}
}
目前没有回答
相关问题 更多 >
编程相关推荐