Lista ALL Variáveis Ansible para um host ou grupo com um comando ad hoc?

18

As variáveis analisáveis vêm de uma variedade de fontes. Por exemplo, é possível fornecer host_vars e group_vars criando arquivos YAML em uma subpasta denominada host_vars e group_vars , respectivamente, da pasta que contém o arquivo de inventário.

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

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

Versão Ansible: 1.9.1.

    
por 0xC0000022L 10.06.2015 / 22:53

3 respostas

18

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

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 obter:

$ 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"
        }
    }
}
    
por 11.06.2015 / 02:29
2

FYI: Este projeto do github mostra como listar 90% das variáveis em todos os hosts. Eu 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 para executar isso no final de um manual para ver todos os fatos. Para também depurar o comportamento da tarefa, use register:

    
por 10.04.2016 / 17:40
1

Adicionando uma pequena dica para a resposta realmente boa acima, se você quiser avançar de maneira programática, pode

Use a resposta existente para hostvars :

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

Mas ansible_facts está vazio porque debug não executa o módulo setup . Então você precisa tentar algo extra como jq após aparar a saída para torná-la válida json.

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

Eu achei que as pessoas poderiam achar isso útil ao investigar a parede gigante de texto que retorna em fatos ansiosos quando você quer apenas uma coisa como jq .ansible_facts.ansible_devices.vda.size

    
por 07.09.2018 / 07:05

Tags