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

Kad*_*dir 20 ansible

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

lar*_*sks 36

您只需groups使用debug模块检查变量:

ansible localhost -m debug -a 'var=groups.keys()'
Run Code Online (Sandbox Code Playgroud)

以上groups.keys()用于获取组列表.您可以删除该.keys()部分以查看组成员身份:

ansible localhost -m debug -a 'var=groups'
Run Code Online (Sandbox Code Playgroud)

  • 还有 `ansible-inventory -i inventory/prod.yml --list` (5认同)

Per*_*erg 15

列出组

使用 Ansible + jq内置的工具,这会给你一些相当接近的东西:

ansible-inventory --list | jq "keys"
Run Code Online (Sandbox Code Playgroud)

与手动解析清单文件相比,这种方法的优点是它充分利用您的ansible.cfg文件(可以指向一个或多个清单文件、清单文件目录等)。

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

ansible-inventory --list | jq "keys"
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢纯文本形式,请使用类似 的方法ansible-inventory --list | jq -r "keys | .[]"。它会给你这样的输出:

_meta
all
local_redis_all
Run Code Online (Sandbox Code Playgroud)

列出主机

这不是原始问题的一部分,但无论如何都将其包含在此处,因为它可能对我的一些读者有用。使用以下命令进行 JSON 输出(注意:该命令实际上为每个组输出一个 JSON 数组,我还没有找到一种方法来压平这些数组jq- 欢迎提出建议):

ansible-inventory --list | jq ".[].hosts | map(.)?

这将为您提供类似于以下内容的输出:

[
  "_meta",
  "all",
  "local_redis_all",
]
Run Code Online (Sandbox Code Playgroud)

同样,在原始文本格式中(每行一个主机):ansible-inventory --list | jq -r ".[].hosts | .[]?"

这会给你这样的输出:

redis-01
redis-02
redis-03
Run Code Online (Sandbox Code Playgroud)


Fuj*_*lan 10

注意:- 对于新 Ansible 用户

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

通过此链接,您将获得魔法变量的完整列表Magic Variables

有一个名为“groups”的神奇变量,它保存库存组信息。我们可以使用名为debug的 ansible 模块访问任何变量的值(用户定义的变量和内部变量)。

我正在使用单独的库存文件

$
$ 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": []
    }
}
Run Code Online (Sandbox Code Playgroud)


slm*_*slm 5

方法#1 - 使用 Ansible

如果您只想要给定库存文件中的组列表,您可以使用其他几个答案中提到的魔术变量。

在这种情况下,您可以使用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'])"
}
Run Code Online (Sandbox Code Playgroud)

方法 #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]
Run Code Online (Sandbox Code Playgroud)

不过,您需要弄清楚第二种方法的输出,或者您可以使用sed它来做到这一点:

$ grep -E '^\[' inventory/rhvh | sed 's/:children//'
[dc1-rhvh]
[dc2-rhvh]
[dc3-rhvh]
[dc4-rhvh]
[dc5-rhvh]
[rhvh]
[dc1]
[dc2]
[dc3]
[dc4]
[dc5]
Run Code Online (Sandbox Code Playgroud)