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

Dynamic Inventory script output vs JSON file

我正在编写一个查询 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 读入的字典这一事实外,我在这里看不到 different/wrong 是什么。为什么存储的 JSON 输出在脚本不起作用的地方有效?

所以事实证明 all 是一个特殊的组,但只有在用脚本解析器解释时。在静态清单中,all 可以是具有空值 的键的 字典,但是当来自脚本时,allhost 值必须是 字符串列表.

{"all": 
  {"hosts": ["admiring_chandrasekhar", "inv_inky_1", "inv_pinky_1", 
             "inv_blinky_1", "inv_clyde_1"], 
   "_meta": {"hostvars": {}}, 
   "vars": {"ansible_connection": "docker"}}}