动态库存脚本输出与 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 可以是具有空值 的键的 字典,但是当来自脚本时,all
的 host
值必须是 字符串列表.
{"all":
{"hosts": ["admiring_chandrasekhar", "inv_inky_1", "inv_pinky_1",
"inv_blinky_1", "inv_clyde_1"],
"_meta": {"hostvars": {}},
"vars": {"ansible_connection": "docker"}}}
我正在编写一个查询 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 可以是具有空值 的键的 字典,但是当来自脚本时,all
的 host
值必须是 字符串列表.
{"all":
{"hosts": ["admiring_chandrasekhar", "inv_inky_1", "inv_pinky_1",
"inv_blinky_1", "inv_clyde_1"],
"_meta": {"hostvars": {}},
"vars": {"ansible_connection": "docker"}}}