¿Enumerar TODAS las variables Ansible para un host o grupo con un comando ad hoc?

25

Las variables de respuesta provienen de una variedad de fuentes. Por ejemplo, es posible proporcionar host_vars y group_vars creando archivos YAML en una subcarpeta denominada host_varsy, group_varsrespectivamente, de la carpeta que contiene el archivo de inventario.

¿Cómo puedo enumerar todas las variables Ansible sería saber acerca de un grupo o host dentro de un libro de jugadas? Nota: Lo intenté ansible -m debug -e 'var=hostvars' hosty fue ansible -m debug -e '- debug: var=hostvars'en vano.

Sugerencia: noansible <group|host> -m setup es la respuesta correcta, ya que no incluye todas las variables que provienen de otras fuentes (solo contiene . De hecho, ni siquiera incluye las variables proporcionadas por un script de inventario dinámico (vía, etc.).{ "ansible_facts" : { ... } }_meta

Versión que responde: 1.9.1.

0xC0000022L
fuente

Respuestas:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"parece funcionar. Fuentes variables válidos ( host_vars, group_vars, _metaen un inventario dinámico, etc.) son tomados en cuenta.

Con script de inventario 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

Puedes obtener:

$ 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
fuente
Con ansible 2.0.2, esto ya no parece funcionar. La salida eslocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
Edición sugerida para usar "var=hostvars[inventory_hostname]"en ansible> 2.0
stuart-warren
Para 1.9.4 no devuelve las cosas devueltas poransible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov
1
Esto funcionó para míansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro
2

FYI: Este proyecto github le muestra cómo enumerar el 90% de las variables en todos los hosts. Me resulta más útil a nivel mundial que los comandos de host único. El archivo README incluye instrucciones para crear un informe de inventario simple. Es aún más valioso ejecutar esto al final de un libro de jugadas para ver todos los hechos. Para depurar también el comportamiento de la tarea, utilice el registro:

Larry Fast
fuente
2

Agregando un pequeño consejo a la muy buena respuesta anterior, si quieres hurgar programáticamente puedes

Use la respuesta existente para hostvars :

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

Pero ansible_facts está vacío porque debugno ejecuta el setupmódulo. Por lo tanto, debe probar algo adicional, como jqdespués de recortar la salida para que sea válida json.

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

Pensé que la gente podría encontrar esto útil al investigar el muro gigante de texto que regresa en hechos visibles cuando solo quieres una cosa como jq .ansible_facts.ansible_devices.vda.size

KCD
fuente