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

时间:2015-10-27 08:29:12

标签: ansible

据我所知,ansible有一个名为--list-hosts的选项用于列出主机。是否有任何列出主机组的选项?或者任何其他方式来通过?

6 个答案:

答案 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)

方法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-使用grepsed

您当然也可以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 "\[.*\]"