Frage Wie kann ich mit Ansible auf die Hostvariable eines anderen Hosts zugreifen?


Nehmen wir an, wir haben einen Host, der Daten sammelt und in einer Gruppe ist [collectors]. Ich habe auch Gastgeber in der Gruppe [reporters]. Also ich möchte eine Variable auf Reporter setzen groups['collectors'][0] IP Adresse. Aber das Playbook zum Einrichten von Reportern läuft nicht weiter [collectors] Gruppe so Fakten für diesen Gastgeber werden nicht gesammelt. Gibt es eine Möglichkeit, die IP-Adresse nicht fest zu codieren?


39
2017-10-21 08:05


Ursprung




Antworten:


Sie können auf so ziemlich alle Inventartats / -variablen zugreifen, indem Sie Folgendes tun:

{{ 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 sollten also Ihr Playbook, das gegen die Reportergruppe läuft, modifizieren, um eine No-Op (Dummy) Aufgabe hinzuzufügen zu der Sammlergruppe. Das wird dazu führen, dass Ansible Fakten über die Sammler-Hosts sammelt, so dass sie von der Reporter-Gruppe abgerufen werden können. Vielleicht möchtest du etwas wie oben in deinem Reporter-Playbook hinzufügen:

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

Die leeren Klammern bedeuten im Grunde, dass keine Aufgaben ausgeführt werden, aber dies wird Ansible trotzdem zwingen, Fakten über die Sammler zu sammeln, damit Sie sie dann in den Aufgaben, die Sie gegen Ihre Reporter ausführen, referenzieren können.

Bearbeite # 1

Es fiel mir ein, dass ich auch erwähnen sollte, dass ab Version 1.8 von Ansible ein Fakten-Caching Feature, das jetzt verfügbar ist. Fact-Caching basiert auf einem Redis-Server, um Fakten zwischen den Playbook-Läufen zu speichern. Wenn es aktiviert ist, kann ein Playbook auf Fakten verweisen, die von einem anderen Playbook erhalten wurden, das zuvor ausgeführt wurde. Das Beispiel der Ansible-Dokumentation zeigt:

Stellen Sie sich zum Beispiel eine sehr große Infrastruktur mit Tausenden von Hosts vor. Das Fact-Caching könnte für die nächtliche Ausführung konfiguriert werden, aber die Konfiguration einer kleinen Gruppe von Servern könnte ad-hoc oder periodisch während des Tages ausgeführt werden. Wenn Fact-Caching aktiviert ist, müssen nicht alle Server auf Referenzvariablen und Informationen zu ihnen "getroffen" werden.


74
2017-10-23 21:37



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']}}" - corretge
Um der obigen Antwort hinzuzufügen, stellen Sie sicher, dass Sie hier auf die FAQ von Ansible verweisen: docs.ansible.com/ansible/faq.html Das erklärt Dinge im Detail, wie zum Beispiel das Durchlaufen einer Gruppe von Hosts oder das Setzen einer Variablen, um einen bestimmten Host in einer Gruppe zu erhalten. - einarc
Du bist der Mann!!! - dsutherland
Vielen Dank für die Idee, Fakten von einem Knoten mit einer leeren Aufgabenliste zu holen. - pedz