Listar TODAS variáveis ​​variáveis ​​possíveis para um host ou grupo com um comando ad hoc?

25

Variáveis ​​possíveis vêm de uma variedade de fontes. É possível, por exemplo, fornecer host_vars e group_vars criando arquivos YAML em uma subpasta denominada host_varse group_varsrespectivamente da pasta que contém o arquivo de inventário.

Como posso listar todas as variáveis Ansible iria saber sobre um grupo ou host dentro de uma cartilha? Nota: Eu tentei ansible -m debug -e 'var=hostvars' hoste ansible -m debug -e '- debug: var=hostvars'sem sucesso.

Dica: nãoansible <group|host> -m setup é a resposta correta, pois não inclui todas as variáveis ​​provenientes de outras fontes (apenas contém . Na verdade, nem sequer inclui variáveis ​​fornecidas por um script de inventário dinâmico (via e assim por diante).{ "ansible_facts" : { ... } }_meta

Versão responsável: 1.9.1.

0xC0000022L
fonte

Respostas:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"parece funcionar. Fontes variáveis válidos ( host_vars, group_vars, _metaem um inventário dinâmico, etc.) são levados em conta.

Com script de inventário dinâmico 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

Você pode ter:

$ 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
fonte
Com ansible 2.0.2, isso parece não funcionar mais. A saída élocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
Editar sugerido o uso "var=hostvars[inventory_hostname]"em ansible> 2.0
stuart-Warren
Para o 1.9.4, ele não retorna o material retornado poransible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov 11/11/16
11
Isso funcionou para mimansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro
2

FYI: Este projeto do github mostra como listar 90% das variáveis ​​em todos os hosts. Acho mais útil globalmente do que comandos de host único. O README inclui instruções para criar um relatório de inventário simples. É ainda mais valioso executar isso no final de um manual para ver todos os fatos. Para depurar também o comportamento da tarefa, use register:

Larry Fast
fonte
2

Adicionando uma pequena dica à resposta realmente boa acima, se você quiser bisbilhotar programaticamente, pode

Use a resposta existente para hostvars :

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

Mas ansible_facts está vazio porque debugnão executa o setupmódulo. Então, você precisa tentar algo extra, como jqdepois de aparar a saída para torná-la json válida.

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

Eu pensei que as pessoas acham isso útil ao investigar a parede gigante de texto que volta em fatos ansiosos quando você só quer algo como jq .ansible_facts.ansible_devices.vda.size

KCD
fonte