我正在编写一个查询Docker容器的动态库存脚本。它输出JSON,我可以保存到文件并使用,但是当我尝试直接使用脚本时,我从Ansible得到解析错误。
[root@297b1ca0cfa4 /]# docker-dynamic-inventory > inv.json
[root@297b1ca0cfa4 /]# cat inv.json
{"all": {"hosts": {"inv_clyde_1": null, "inv_blinky_1": null, "inv_inky_1": null, "inv_pinky_1": null, "admiring_chandrasekhar": null}, "_meta": {"hostvars": {}}, "vars": {"ansible_connection": "docker"}}}
[root@297b1ca0cfa4 /]# ansible all -i inv.json -m ping
inv_clyde_1 | FAILED! => {
"failed": true,
"msg": "docker command not found in PATH"
}
请注意,如果ping失败,我就不在乎,到目前为止意味着我的广告资源有效。 Ansible成功解释了JSON及其代表的库存。现在将其与直接使用脚本进行比较:
[root@297b1ca0cfa4 /]# ansible all -i /usr/bin/docker-dynamic-inventory -m ping
[WARNING]: * Failed to parse /usr/bin/docker-dynamic-inventory with script plugin:
You defined a group 'all' with bad data for the host list:
{u'hosts': {u'inv_clyde_1': None, u'inv_inky_1': None,
u'admiring_chandrasekhar': None, u'inv_pinky_1': None, u'inv_blinky_1': None},
u'_meta': {u'hostvars': {}}, u'vars': {u'ansible_connection': u'docker'}}
Ansible's docs on Inventory使用字典和空值来表示主机,这就是我在这里做的原因。
除了Ansible打印从JSON读取的字典之外,我还没有看到这里有什么不同/错误。为什么存储的JSON输出适用于脚本赢得的地方?
答案 0 :(得分:2)
事实证明all
是一个特殊的组,但只有在使用脚本解析器进行解释时才会这样。在静态广告资源中,所有广告资源都可以是具有空值的密钥字典,但是当来自脚本时,host
的{{1}}值必须是列表字符串。
all