Liste TOUTES les variables Ansible pour un hôte ou un groupe avec une commande ad hoc?

25

Les variables possibles proviennent de diverses sources. Il est par exemple possible de fournir host_vars et group_vars en créant des fichiers YAML dans un sous-dossier nommé host_varset group_varsrespectivement du dossier contenant le fichier d'inventaire.

Comment puis - je énumérer toutes les variables Ansible se connaître sur un groupe ou un hôte dans un livre de jeux? Remarque: j'ai essayé ansible -m debug -e 'var=hostvars' hostet ansible -m debug -e '- debug: var=hostvars'en vain.

Astuce: ansible <group|host> -m setupn'est pas la bonne réponse car elle n'inclut pas toutes les variables qui proviennent d'autres sources (elle ne contient que { "ansible_facts" : { ... } }. En fait, elle n'inclut même pas les variables fournies par un script d'inventaire dynamique (via _metaet ainsi de suite).

Version Ansible: 1.9.1.

0xC0000022L
la source

Réponses:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"semble fonctionner. Sources variables valides ( host_vars, group_vars, _metadans un inventaire dynamique, etc.) sont pris en compte.

Avec un script d'inventaire dynamique 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

Tu peux recevoir:

$ 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
la source
Avec ansible 2.0.2, cela ne semble plus fonctionner. La sortie estlocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
"var=hostvars[inventory_hostname]"Modification suggérée à utiliser sur ansible> 2.0
stuart-warren
Pour 1.9.4, il ne retourne pas les éléments retournés paransible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov
1
Cela a fonctionné pour moiansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro
2

FYI: Ce projet github vous montre comment lister 90% des variables sur tous les hôtes. Je le trouve plus utile à l'échelle mondiale que les commandes d'hôte unique. Le fichier README comprend des instructions pour créer un rapport d'inventaire simple. Il est encore plus utile de l'exécuter à la fin d'un manuel pour voir tous les faits. Pour déboguer également le comportement de la tâche, utilisez le registre:

Larry Fast
la source
2

En ajoutant un petit conseil à la très bonne réponse ci-dessus, si vous voulez fouiller par programme, vous pouvez

Utilisez la réponse existante pour les hostvars :

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

Mais ansible_facts est vide car debugne lance pas le setupmodule. Vous devez donc essayer quelque chose de plus comme jqaprès avoir coupé la sortie pour la rendre valide json.

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

Je pensais que les gens pourraient trouver cela utile lorsqu'ils enquêtent sur le mur de texte géant qui revient dans des faits ansibles lorsque vous voulez juste une chose comme jq .ansible_facts.ansible_devices.vda.size

KCD
la source