¿Cómo acceder a la variable de host de un host diferente con Ansible?

45

Digamos que tiene un host que recopila algunos datos y está en un grupo [collectors]. También tengo anfitriones en grupo [reporters]. Entonces, quiero establecer una variable en los reporteros desde la groups['collectors'][0]dirección IP. Pero el libro de jugadas para configurar reporteros no se ejecuta en [collectors]grupo, por lo que no se recopilan datos para este anfitrión. ¿Hay alguna manera de no codificar la dirección IP?

hryamzik
fuente

Respuestas:

87

Puede acceder a casi todos los datos / variables de inventario haciendo algo como esto:

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

o, si desea hacerlo a través de un índice en un grupo:

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

El gran truco es que necesita recopilar los datos de todos los hosts / grupos que le interesan. Por lo tanto, debe modificar su libro de jugadas que se ejecuta contra el grupo de reporteros para incluir una tarea no operativa (ficticia) que se aplica al grupo de coleccionistas. Eso hará que Ansible recopile datos sobre los anfitriones de los recopiladores para que se pueda acceder desde el grupo de reporteros. Por lo tanto, es posible que desee agregar algo como esto en la parte superior de su libro de jugadas de reporteros:

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

Los corchetes vacíos básicamente significan que no se ejecutarán tareas, pero esto aún obligará a Ansible a recopilar datos sobre los recopiladores para que luego pueda hacer referencia a ellos en las tareas que ejecuta contra sus reporteros.

Editar # 1

Se me ocurrió que también debería mencionar que a partir de la versión 1.8 de Ansible, hay una característica de almacenamiento en caché de hechos que ahora está disponible. El almacenamiento en caché de hechos se basa en un servidor redis para almacenar hechos entre las ejecuciones del libro de jugadas. Con esto habilitado, un libro de jugadas puede hacer referencia a hechos obtenidos por otro libro de jugadas que se ejecutó anteriormente. El ejemplo que proporciona la documentación de Ansible:

Imagine, por ejemplo, una infraestructura muy grande con miles de hosts. El almacenamiento en caché de hechos podría configurarse para ejecutarse todas las noches, pero la configuración de un pequeño conjunto de servidores podría ejecutarse ad-hoc o periódicamente durante todo el día. Con el almacenamiento en caché de datos habilitado, no sería necesario "presionar" a todos los servidores para hacer referencia a variables e información sobre ellos.

Bruce P
fuente
2
¿Hay alguna manera de establecer el índice asociativo como una variable? en ejemplo localhost ansible --extra-vars "metamorphosis_ip = 172.16.3.73" -a "echo {{hostvars [{{metamorphosis_ip}}] ['inv_domain']}}"
corretge
Para agregar a la respuesta anterior, asegúrese de hacer referencia a las Preguntas frecuentes de Ansible aquí: docs.ansible.com/ansible/faq.html que explica las cosas en detalle, como recorrer un grupo de hosts o configurar una variable para obtener un host específico en un grupo.
einarc
Gracias por la idea de obtener datos de un nodo con una lista de tareas vacía.
pedz