背景
我通过 Terraform 管理域,它输出服务器 IP 地址。然后我有一个输出 YAML 清单的脚本(稍后输出)。
- Ansible 2.6.2
- 格式来源:https ://docs.ansible.com/ansible/2.6/user_guide/intro_inventory.html#hosts-and-groups
问题
当我运行ansible-inventory --inventory inventory.sh --graph
它时,它总是以
@all:
|--@stage:
|--@ungrouped:
| |--18.66.1.28
如果我希望机器处于小组赛阶段。
我发现静态清单和作为脚本输出的清单有不同的行为。
静态文件
如果您将其保存为静态文件并将其用作库存,它将起作用。
all:
hosts:
18.66.1.28
children:
stage:
hosts:
18.66.1.28:
输出:
@all:
|--@stage:
| |--18.66.1.28
|--@ungrouped:
脚本
但是如果你像下面这样指定shell脚本,它就行不通了
#!/bin/bash
echo "all:
hosts:
18.66.1.28
children:
stage:
hosts:
18.66.1.28:"
输出:
[WARNING]: * Failed to parse /tmp/inventory.sh with script plugin: You defined a group 'all' with bad data for the host list: {u'hosts':
u'18.66.1.28', u'children': {u'stage': {u'hosts': {u'18.66.1.28': None}}}}
[WARNING]: * Failed to parse /tmp/inventory.sh with ini plugin: /tmp/inventory.sh:3: Error parsing host definition 'echo "all:': No closing
quotation
[WARNING]: Unable to parse /tmp/inventory.sh as an inventory source
[WARNING]: No inventory was parsed, only implicit localhost is available
YAML 输出
变体 1
all:
hosts:
- 18.66.1.28
children:
stage:
hosts:
- 18.66.1.28:
变体 2
all:
hosts:
- 18.66.1.28
children:
stage:
hosts:
18.66.1.28:
变体 3
all:
hosts:
- 18.66.1.28
children:
stage:
hosts:
- 18.66.1.28
简短的回答
不要看https://docs.ansible.com/ansible/2.6/user_guide/intro_inventory.html而是看https://docs.ansible.com/ansible/2.6/dev_guide/developing_inventory.html。
长答案
Ansible 使用至少三种格式的清单。YAML、INI 和 JSON。INI 格式是完全独立的格式,有自己的结构。YAML 和 JSON 本身允许创建几乎相同的数据结构。当我查看充满 YAML 示例的https://docs.ansible.com/ansible/2.6/user_guide/intro_inventory.html时,使用 JSON 我只需更改符号以生成与 YAML 相同的数据结构。问题是,脚本插件使用不同的数据结构,但它允许您同时使用 YAML 和 JSON 格式。
例子
静态库存输入:
输出
根据https://docs.ansible.com/ansible/2.6/user_guide/intro_inventory.html ,这是正确的格式和行为。
脚本输入:
输出:
这不是我所期望的。问题是脚本插件需要不同的数据结构。让我们用来自https://docs.ansible.com/ansible/2.6/dev_guide/developing_inventory.html的数据结构来试试这个。
输入:
输出
是的,这是我预期的结果。机器在正确的组中,摄取插件没有抱怨任何事情。当然,根据“动态库存源”,脚本应该做的不仅仅是
echo
库存,它可能应该输出 JSON,这只是演示如何构建脚本化库存的输出。这花了我很多时间来弄清楚,所以我希望通过写这篇文章我能把它保存给其他人。
主机名(您的变体 1)之前不应有破折号。
$ ansible-inventory --inventory 库存--graph
使用破折号,您应该会看到很多警告。
$ ansible-inventory --inventory 库存--graph
引用 man ansible-inventory
如果脚本首先创建一个文件,那么一切都是正确的。
$ ./inventory.sh > /tmp/my_inventory.yml && ansible-inventory --inventory /tmp/my_inventory.yml --graph