ALLE ansiblen Variablen für einen Host oder eine Gruppe mit einem Ad-hoc-Befehl auflisten?

25

Ansible Variablen kommen aus verschiedenen Quellen. Es ist zum Beispiel möglich , host_vars und group_vars zu schaffen , durch YAML - Dateien in einem Unterordner mit dem Namen Erstellen host_varsund group_varsjeweils des Ordners mit der Inventardatei enthält.

Wie kann ich alle Variablen auflisten, die Ansible über eine Gruppe oder einen Host in einem Playbook wissen würde ? Hinweis: Ich habe es versucht ansible -m debug -e 'var=hostvars' hostund ansible -m debug -e '- debug: var=hostvars'ohne Erfolg.

Hinweis: ansible <group|host> -m setupist nicht die richtige Antwort, da sie nicht alle Variablen enthält, die aus anderen Quellen stammen (sie enthält nur { "ansible_facts" : { ... } }Variablen _meta).

Ansible Version: 1.9.1.

0xC0000022L
quelle

Antworten:

26

ansible -m debug -a "var=hostvars[inventory_hostname]"scheint zu funktionieren. Gültige variable Quellen ( host_vars, group_vars, _metain einem dynamischen Inventar, usw.) werden alle berücksichtigt.

Mit dynamischem Inventarskript 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

Du kannst bekommen:

$ 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
quelle
Mit ansible 2.0.2scheint das nicht mehr zu funktionieren. Die Ausgabe istlocalhost | SUCCESS => { "hostvars": "<ansible.vars.hostvars.HostVars object at 0x7f320943da10>" }
Zulakis
Vorgeschlagene Bearbeitung für "var=hostvars[inventory_hostname]"ansible> 2.0
stuart-warren
Für 1.9.4 wird das vonansible my.hostname.example.com -m setup -i ../my/inventory/hosts.example -u root
akostadinov am
1
Dies funktionierte für michansible host-name -m debug -a "var=[var_name]" -i inventory/testing/hosts
Montaro
2

Zu Ihrer Information : Dieses Github-Projekt zeigt Ihnen, wie Sie 90% der Variablen auf allen Hosts auflisten. Ich finde es global nützlicher als einzelne Host-Befehle. Die README-Datei enthält Anweisungen zum Erstellen eines einfachen Inventarberichts. Es ist sogar noch wertvoller, dies am Ende eines Playbooks auszuführen, um alle Fakten zu sehen. Verwenden Sie register, um auch das Verhalten von Tasks zu debuggen:

Larry Fast
quelle
2

Fügen Sie der wirklich guten Antwort oben einen kleinen Tipp hinzu, wenn Sie programmatisch herumstöbern möchten

Verwenden Sie die vorhandene Antwort für Hostvars :

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

Aber ansible_facts ist leer , weil debugnicht das läuft setupModul. Sie müssen also jqnach dem Trimmen der Ausgabe etwas Besonderes ausprobieren , um sie für json gültig zu machen.

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

Ich dachte, dass die Leute dies nützlich finden könnten, wenn sie die riesige Textwand untersuchen, die in ansiblen Fakten wieder auftaucht, wenn Sie nur eine Sache wie wollen jq .ansible_facts.ansible_devices.vda.size

KCD
quelle