据我所知,ansible有一个名为--list-hosts
的选项用于列出主机。是否有任何列出主机组的选项?或者任何其他方式来通过?
答案 0 :(得分:30)
您只需使用groups
模块检查debug
变量:
ansible localhost -m debug -a 'var=groups.keys()'
以上是使用groups.keys()
来获取组列表。您可以删除.keys()
部分以查看群组成员身份:
ansible localhost -m debug -a 'var=groups'
答案 1 :(得分:2)
注意:-对于新的Ansible用户
Ansible具有一些特殊的内部变量,也称为魔术变量。
通过此链接,您将获得完整的魔术变量列表Magic Variables
有一个称为“组”的魔术变量,用于保存库存组信息。 我们可以使用名为 debug 的ansible模块访问任何变量(用户定义的变量和Internal的变量)的值。
我正在使用单独的库存文件
$
$ ansible -i inventory.ini all -m debug -a "var=groups"
$
centos-client.ansible.lab | SUCCESS => {
"groups": {
"all": [
"centos-client.ansible.lab",
"ubuntu-client.ansible.lab"
],
"centos": [
"centos-client.ansible.lab"
],
"ubuntu": [
"ubuntu-client.ansible.lab"
],
"ungrouped": []
}
}
ubuntu-client.ansible.lab | SUCCESS => {
"groups": {
"all": [
"centos-client.ansible.lab",
"ubuntu-client.ansible.lab"
],
"centos": [
"centos-client.ansible.lab"
],
"ubuntu": [
"ubuntu-client.ansible.lab"
],
"ungrouped": []
}
}
答案 2 :(得分:1)
如果不确定主机是否真正在清单中,可以使用:
ansible -i hosts/ localhost -m debug -a 'var=groups'
-i
保存库存文件的位置
-m
启用模块调试。
-a
个模块参数。
它将只输出一次组/主机,而不是清单中的每个主机。
使用同样的方法获取清单中的组列表:
ansible -i hosts/ localhost -m debug -a 'var=groups.keys()'
答案 3 :(得分:1)
如果您只想要给定清单文件中的组列表,则可以使用magic variables,如其他几个答案中所述。
在这种情况下,您可以使用groups
魔术变量,并且只需在此哈希中显示keys()
(键+值)即可。键是组的所有名称。
注意::通过定位localhost
,我们强制此命令在处理清单文件时仅针对单个主机运行。
$ ansible -i inventory/rhvh localhost -m debug -a 'var=groups.keys()
localhost | SUCCESS => {
"groups.keys()": "dict_keys(['all', 'ungrouped', 'dc1-rhvh', 'dc2-rhvh', 'dc3-rhvh', 'dc4-rhvh', 'dc5-rhvh', 'rhvh', 'dc1', 'dc2', 'dc3', 'dc4', 'dc5', 'production'])"
}
grep
和sed
您当然也可以grep
库存文件的内容:
$ grep -E '^\[' inventory/rhvh
[dc1-rhvh]
[dc2-rhvh]
[dc3-rhvh]
[dc4-rhvh]
[dc5-rhvh]
[rhvh:children]
[dc1:children]
[dc2:children]
[dc3:children]
[dc4:children]
[dc5:children]
[production:children]
尽管您想从第二种方法的输出中脱颖而出,也可以使用sed
来做到这一点:
$ grep -E '^\[' inventory/rhvh | sed 's/:children//'
[dc1-rhvh]
[dc2-rhvh]
[dc3-rhvh]
[dc4-rhvh]
[dc5-rhvh]
[rhvh]
[dc1]
[dc2]
[dc3]
[dc4]
[dc5]
答案 4 :(得分:1)
使用Ansible + jq内置的工具,可以给您一些合理的帮助:
ansible-inventory --list | jq "keys"
与手动解析清单文件相比,此方法的优势在于,它可以充分利用您的ansible.cfg
文件(可以指向一个或多个清单文件,清单文件目录等)。
我的机器上的示例输出(local_redis_all
是本地定义的Ansible组):
[
"_meta",
"all",
"local_redis_all",
]
如果您喜欢纯文本格式,请使用类似ansible-inventory --list | jq -r "keys | .[]"
的方法。它将为您提供如下输出:
_meta
all
local_redis_all
这不是原始问题的一部分,但是无论如何都将其包含在此处,因为它对某些读者可能有用。使用以下命令进行JSON输出(请注意:该命令实际上为每个组输出一个JSON数组,我还没有找到用jq
来展平它们的方法-欢迎提出建议):
ansible-inventory --list | jq ".[].hosts | map(.)?
这将为您提供类似于以下内容的输出:
[
"redis-01",
"redis-02",
"redis-03"
]
同样,以原始文本格式(每行一个主机):ansible-inventory --list | jq -r ".[].hosts | .[]?"
这会给你这样的输出:
redis-01
redis-02
redis-03
答案 5 :(得分:-4)
那样的东西?
cat ~/inventory/* | grep "\[.*\]"