come accedere alla variabile host di un host diverso con Ansible?


45

Diciamo di avere un host che raccoglie alcuni dati ed è in un gruppo [collectors]. Ho anche host in gruppo [reporters]. Quindi voglio impostare una variabile sui giornalisti dall'indirizzo groups['collectors'][0]IP. Ma il playbook per la creazione di reporter non funziona in [collectors]gruppo, quindi i fatti per questo host non vengono raccolti. C'è un modo per non codificare l'indirizzo IP?

Risposte:


87

Puoi accedere praticamente a qualsiasi dato / variabile di inventario facendo una cosa del genere:

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

oppure, se si desidera farlo tramite un indice in un gruppo:

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

Il grande trucco è che devi raccogliere i fatti per tutti gli host / gruppi a cui sei interessato. Quindi, vorrai modificare il tuo playbook che corre contro il gruppo dei reporter per includere un'attività no-op (fittizia) che viene applicata al gruppo dei collezionisti. Ciò farà sì che Ansible raccolga fatti sugli host dei collezionisti in modo che possano accedervi dal gruppo dei reporter. Quindi potresti voler aggiungere qualcosa di simile nella parte superiore del tuo playbook giornalisti:

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

Le parentesi vuote significano fondamentalmente che nessuna attività verrà eseguita, ma questo costringerà comunque Ansible a raccogliere fatti sui collezionisti in modo da poterli fare riferimento nelle attività che esegui contro i tuoi giornalisti.

Modifica n. 1

Mi è venuto in mente che dovrei anche menzionare che a partire dalla versione 1.8 di Ansible, è ora disponibile una funzionalità di memorizzazione nella cache dei fatti . La memorizzazione nella cache dei fatti si basa su un server redis per memorizzare i fatti tra le esecuzioni del playbook. Con questa opzione abilitata, un playbook può fare riferimento a fatti ottenuti da un altro playbook eseguito in precedenza. L'esempio della documentazione Ansible fornisce:

Immagina, ad esempio, un'infrastruttura molto grande con migliaia di host. La memorizzazione nella cache dei fatti potrebbe essere configurata per l'esecuzione notturna, ma la configurazione di un piccolo set di server potrebbe essere eseguita ad hoc o periodicamente durante il giorno. Con la cache dei fatti abilitata, non sarebbe necessario "colpire" tutti i server per fare riferimento a variabili e informazioni su di essi.


2
C'è un modo per impostare l'indice associativo come variabile? in esempio, localhost --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
correggi

Per aggiungere la risposta sopra sopra, assicurati di fare riferimento alle FAQ di Ansible qui: docs.ansible.com/ansible/faq.html che spiega le cose in dettaglio, come il loop su un gruppo di host o l'impostazione di una variabile per ottenere un host specifico in un gruppo.
einarc,

Grazie per l'idea di recuperare fatti da un nodo con un elenco di attività vuoto.
pedz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.