Ansible 动态清单脚本输出与JSON文件

Ansible 动态清单脚本输出与JSON文件,ansible,ansible-inventory,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

我正在编写一个查询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打印它从JSON读入的dict之外,我看不出这里有什么不同/错误。为什么存储的JSON输出在脚本无法工作的地方工作?

因此,原来
all
是一个特殊的组,但只有在使用脚本解析器进行解释时才工作。在静态资源清册中,all可以是具有空值的键的字典,但是当来自脚本时,
all
主机
值必须是字符串列表

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

因此,事实证明
all
是一个特殊的组,但只有在使用脚本解析器进行解释时才是如此。在静态资源清册中,all可以是具有空值的键的字典,但是当来自脚本时,
all
主机
值必须是字符串列表

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

“使用字典和空值表示主机来显示”ー 那不是真的,仔细阅读。@techraf是的。如果转到Hosts和Groups部分,您将看到YAML示例中显示的所有主机都是具有null值的键。这是YAML处理null的方法之一。您还可以在其中写入
null
。另外,如果你能指出你的意思,而不是留下一个隐晦和屈尊的评论,我将不胜感激。不,他们不是。仔细阅读:在
all:
下,您可以看到
hosts:
下的单个元素(
mail.example.com
)字符串列表。在该列表的正下方,所有子元素都有
hosts
,它们是具有空值的键。“使用字典和空值来表示主机。”ー 那不是真的,仔细阅读。@techraf是的。如果转到Hosts和Groups部分,您将看到YAML示例中显示的所有主机都是具有null值的键。这是YAML处理null的方法之一。您还可以在其中写入
null
。另外,如果你能指出你的意思,而不是留下一个隐晦和屈尊的评论,我将不胜感激。不,他们不是。仔细阅读:在
all:
下,您可以看到
hosts:
下的单个元素(
mail.example.com
)字符串列表。在该列表的正下方,所有子元素都有
hosts
,它们是具有空值的键。