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


25

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

我如何列出Ansible 了解的一本剧本中的组或主机的所有变量?注意:我尝试了,但无济于事。ansible -m debug -e 'var=hostvars' hostansible -m debug -e '- debug: var=hostvars'

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

Ansible版本:1.9.1。

Answers:


26

ansible -m debug -a "var=hostvars[inventory_hostname]"似乎有效。有效变量源(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"
        }
    }
}

使用ansible 2.0.2,这似乎不再起作用。输出是localhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis

建议编辑使用"var=hostvars[inventory_hostname]"上ansible> 2.0
斯图尔特-沃伦

对于1.9.4,它不会返回由ansible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov

1
这为我工作ansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
蒙塔罗

2

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


2

如果您想以编程方式戳一下,可以在上面的非常好的答案中添加一个小技巧

hostvars使用现有答案:

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

但是 ansible_facts为空,因为debug未运行该setup模块。因此,您需要jq在调整输出以使其有效为json之后尝试其他类似的操作。

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

我认为人们在调查巨大的文字墙时可能会觉得这很有用,因为当您只想像 jq .ansible_facts.ansible_devices.vda.size

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.