Перечислите ВСЕ Ansible переменные для хоста или группы с помощью специальной команды?

25

Ansible переменные приходят из разных источников. Например, можно предоставить host_vars и group_vars, создав файлы YAML в подпапке с именем host_varsи group_varsсоответственно в папке, содержащей файл инвентаризации.

Как я могу перечислить все переменные, которые Ansible будет знать о группе или хосте внутри playbook? Примечание: я пытался ansible -m debug -e 'var=hostvars' hostи ansible -m debug -e '- debug: var=hostvars'безрезультатно.

Подсказка: ansible <group|host> -m setupэто не правильный ответ, так как он не включает все переменные, поступающие из других источников (он содержит только { "ansible_facts" : { ... } }. На самом деле он даже не включает переменные, предоставленные сценарием динамической инвентаризации (через _metaи так далее).

Возможная версия: 1.9.1.

0xC0000022L
источник

Ответы:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"похоже на работу. Допустимые переменные источники ( host_vars, group_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"
        }
    }
}
yaegashi
источник
С ansible 2.0.2это, похоже, больше не работает. Выходные данныеlocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
Предлагается изменить для использования "var=hostvars[inventory_hostname]"на ansible> 2.0
stuart-warren
Для 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

FYI: этот проект github показывает вам, как составить список 90% переменных на всех хостах. Я считаю это более полезным во всем мире, чем команды с одним хостом. README содержит инструкции по созданию простого инвентарного отчета. Еще более ценно запустить это в конце сборника, чтобы увидеть все факты. Для отладки поведения Задачи используйте регистр:

Ларри Фаст
источник
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

Строймеханизация
источник