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.

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"
        }
    }
}

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:


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.