是否有任何选项可以在 Ansible 中列出组?

Is there any option to list groups in Ansible?

据我所知,ansible 有一个名为 --list-hosts 的选项用于列出主机。有没有列出主机组的选项?或者有什么其他方式可以通过?

您可以使用 debug 模块简单地检查 groups 变量:

ansible localhost -m debug -a 'var=groups.keys()'

以上是使用 groups.keys() 获取组列表。您也可以删除 .keys() 部分以查看群组成员资格:

ansible localhost -m debug -a 'var=groups'

类似的东西? cat ~/inventory/* | grep "\[.*\]"

Note:- For New Ansible Users

Ansible 有一些特殊的内部变量,也称为魔术变量。

从这个link你会得到魔法变量的完整列表Magic Variables

有一个名为 "groups" 的魔法变量,它保存着库存组信息。 我们可以使用名为 debug.

的 ansible 模块访问任何变量(用户定义的和内部的)的值

I am Using Separate Inventory File

$
$ 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": []
    }
}

如果您不确定主机是否真的在清单中,您可以使用:

ansible -i hosts/ localhost -m debug -a 'var=groups'

-i 您的库存文件存放的地方
-m 启用模块调试。
-a 模块参数。

它只会输出一次组/主机,而不是您清单中的每个主机。

获取清单中的组列表也是如此:

ansible -i hosts/ localhost -m debug -a 'var=groups.keys()'

方法 #1 - 使用 Ansible

如果您只想要给定清单文件中的组列表,您可以使用其他几个答案中提到的 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'])"
}

方法 #2 - 使用 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]

列出群组

使用工具 built-in 到 Ansible + jq,这给你一些相当接近的东西:

ansible-inventory --list | jq "keys"

与手动解析库存文件相比,此方法的一个优势在于它充分利用了您的 ansible.cfg 文件(可以指向一个或多个库存文件、库存文件目录等)。

我机器上的示例输出(local_redis_all 是本地定义的 Ansible 组):

[
  "_meta",
  "all",
  "local_redis_all",
]

如果您更喜欢 plain-text 形式,请使用 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

另一种查看主机的方法是在 ansible 关键字后按 tab