Wie greife ich mit Ansible auf die Hostvariable eines anderen Hosts zu?

45

Nehmen wir an, ein Host sammelt Daten und befindet sich in einer Gruppe [collectors]. Ich habe auch Gastgeber in der Gruppe [reporters]. Ich möchte also eine Variable für Reporter über die groups['collectors'][0]IP-Adresse festlegen . Das Playbook zum Einrichten von Reportern wird jedoch nicht für [collectors]Gruppen ausgeführt, sodass keine Fakten für diesen Host erfasst werden. Gibt es eine Möglichkeit, die IP-Adresse nicht fest zu codieren?

hryamzik
quelle

Antworten:

87

Sie können auf so ziemlich alle Inventarfakten / -variablen zugreifen, indem Sie wie folgt vorgehen:

{{ hostvars['foo.example.com']['ansible_eth0']['ipv4']['address'] }}

oder, wenn Sie es über einen Index in eine Gruppe tun möchten:

{{ hostvars[groups['collectors'][0]]['ansible_eth0']['ipv4']['address'] }}

Der große Trick ist, dass Sie die Fakten für alle Hosts / Gruppen sammeln müssen, an denen Sie interessiert sind. Sie möchten also Ihr Playbook, das für die Reportergruppe ausgeführt wird, so ändern, dass es eine No-Op-Aufgabe (Dummy-Aufgabe) enthält, die angewendet wird an die Sammlergruppe. Dies veranlasst Ansible, Fakten über die Sammler-Hosts zu sammeln, so dass sie von der Reportergruppe aus abgerufen werden können. Vielleicht möchten Sie so etwas oben in Ihr Reporter-Playbook einfügen:

- hosts: collectors
  name: Gather facts from collectors
  tasks: [ ]

Die leeren Klammern bedeuten im Grunde, dass keine Aufgaben ausgeführt werden. Dies zwingt Ansible jedoch dazu, Fakten zu den Sammlern zu sammeln, damit Sie sie in den Aufgaben referenzieren können, die Sie für Ihre Reporter ausführen.

Bearbeiten Sie # 1

Mir ist der Gedanke gekommen, dass ich auch erwähnen sollte, dass es ab Version 1.8 von Ansible eine Funktion zum Zwischenspeichern von Fakten gibt, die jetzt verfügbar ist. Beim Zwischenspeichern von Fakten wird ein Redis-Server zum Speichern von Fakten zwischen Playbook-Läufen benötigt. Wenn diese Option aktiviert ist, kann ein Playbook auf Fakten verweisen, die von einem anderen Playbook abgerufen wurden, das zuvor ausgeführt wurde. Das Beispiel, das die Ansible-Dokumentation enthält:

Stellen Sie sich zum Beispiel eine sehr große Infrastruktur mit Tausenden von Hosts vor. Das Zwischenspeichern von Fakten kann so konfiguriert werden, dass es nachts ausgeführt wird, die Konfiguration einer kleinen Gruppe von Servern kann jedoch den ganzen Tag über ad-hoc oder regelmäßig ausgeführt werden. Bei aktiviertem Fact-Caching müssten nicht alle Server "getroffen" werden, um auf Variablen und Informationen zu diesen zu verweisen.

Bruce P
quelle
2
Gibt es eine Möglichkeit, den assoziativen Index als Variable festzulegen? im Beispiel ansible localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}"
2.
Wenn Sie die oben stehende Antwort ergänzen möchten , lesen Sie die Ansible-FAQ hier: docs.ansible.com/ansible/faq.html. Dort werden die Details erläutert, z. B. das Durchlaufen einer Gruppe von Hosts oder das Festlegen einer Variablen, um einen bestimmten Host zu erhalten in einer Gruppe.
Einarc
Vielen Dank für die Idee, Fakten von einem Knoten mit einer leeren Aufgabenliste abzurufen.
pedz