使用临时命令列出主机或组的所有 Ansible 变量?

使用临时命令列出主机或组的所有 Ansible 变量?

Ansible 变量有多种来源。例如,可以通过在包含清单文件的文件夹的分别名为host_vars和的子文件夹中创建 YAML 文件来提供 host_vars 和 group_vars。group_vars

我怎样才能列出所有变量安西布尔了解剧本中的组或主机吗?注:我尝试过ansible -m debug -e 'var=hostvars' host,但ansible -m debug -e '- debug: var=hostvars'没有成功。

提示:ansible <group|host> -m setup不是正确答案是这样的不是包括来自其他来源的所有变量(它只包含{ "ansible_facts" : { ... } }。事实上,它甚至不包括动态清单脚本(通过_meta等等)提供的变量。

Ansible 版本:1.9.1。

答案1

ansible <host pattern> -m debug -a "var=hostvars[inventory_hostname]"似乎有效。
替换<host pattern>为任何有效的主机模式

有效的变量源(动态清单中的host_varsgroup_vars、等)都被考虑在内。_meta

使用动态库存脚本hosts.sh

#!/bin/sh
if test "$1" = "--host"; then
        echo {}
else
        cat <<EOF
{
  "ungrouped": [ "x.example.com", "y.example.com" ],
  "group1": [ "a.example.com" ],
  "group2": [ "b.example.com" ],
  "groups": {
    "children": [ "group1", "group2" ],
    "vars": { "ansible_ssh_user": "user" }
  },
  "_meta": {
    "hostvars": {
      "a.example.com": { "ansible_ssh_host": "10.0.0.1" },
      "b.example.com": { "ansible_ssh_host": "10.0.0.2" }
    }
  }
}
EOF
fi

你可以得到:

$ chmod +x hosts.sh
$ ansible -i hosts.sh a.example.com -m debug -a "var=hostvars[inventory_hostname]"
a.example.com | success >> {
    "var": {
        "hostvars": {
            "ansible_ssh_host": "10.0.0.1", 
            "ansible_ssh_user": "user", 
            "group_names": [
                "group1", 
                "groups"
            ], 
            "groups": {
                "all": [
                    "x.example.com", 
                    "y.example.com", 
                    "a.example.com", 
                    "b.example.com"
                ], 
                "group1": [
                    "a.example.com"
                ], 
                "group2": [
                    "b.example.com"
                ], 
                "groups": [
                    "a.example.com", 
                    "b.example.com"
                ], 
                "ungrouped": [
                    "x.example.com", 
                    "y.example.com"
                ]
            }, 
            "inventory_hostname": "a.example.com", 
            "inventory_hostname_short": "a"
        }
    }
}

答案2

在上面的非常好的答案中添加一个小提示,如果您想以编程方式浏览,您可以

使用现有答案主机变量:

ansible -m debug myhost -a "var=hostvars[inventory_hostname].ansible_version"

ansible_事实为空,因为debug不运行该setup模块。因此,您需要jq在修剪输出以使其有效的 json 之后尝试一些额外的操作。

ansible -m setup myhost | sed 's#.*SUCCESS =>##' | jq .ansible_facts.ansible_all_ipv4_addresses

我认为人们在调查 ansible 事实中返回的巨大文本墙时可能会发现这很有用,当你只想要一件事时,比如jq .ansible_facts.ansible_devices.vda.size

答案3

供参考:github 项目向您展示了如何列出所有主机上 90% 的变量。我发现它比单个主机命令在全球范围内更有用。自述文件包含构建简单库存报告的说明。在剧本末尾运行此命令以查看所有事实更有价值。要调试任务行为,请使用寄存器:

相关内容