动态库存脚本输出与JSON文件

时间:2018-02-27 15:45:36

标签: ansible ansible-inventory

我正在编写一个查询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输出适用于脚本赢得的地方?

1 个答案:

答案 0 :(得分:2)

事实证明all是一个特殊的组,但只有在使用脚本解析器进行解释时才会这样。在静态广告资源中,所有广告资源都可以是具有空值的密钥字典,但是当来自脚本时,host的{​​{1}}值必须是列表字符串

all