modules docs ansible ansible-inventory

docs - ansible hosts module



Recargar el inventario dinĂ¡mico de Ansible. (4)

Estoy usando Ansible para configurar instancias de EC2 e implementar una aplicación. Hay un script de hosts que reúne etiquetas relacionadas con servidores y grupos de información. Me gustaría ejecutar estas acciones como un solo libro de jugadas, así que

  1. Se crean nuevas instancias si es necesario
  2. El script de hosts carga el inventario (incluidos los datos de los servidores)
  3. Despliegue de libros de jugadas funciona

Sin embargo, el inventario se carga por adelantado, por lo que no hay datos de servidores / grupos si los servidores se crearon / actualizaron durante el juego. Puedo 1) separar los libros de jugadas de provisión e implementación 2) usar el truco add_host para emular el inventario dinámico cuando se actualizan los servidores, pero existen inconvenientes en esos enfoques.

¿Puedo forzar Ansible para recargar el inventario? Mis archivos de prueba son: hosts script:

#!/bin/sh echo `date` >> log.log echo "{/"standalone/":[/"localhost/"]}"

Ejemplo de playbook.yml :

--- - hosts: all tasks: - name: show inventory_hostname command: echo {{ inventory_hostname }}

Lo ejecuto ansible-playbook -i hosts playbook.yml -v y veo dos ejecuciones:

$> cat log.log Thu Mar 12 09:43:16 SAMT 2015 Thu Mar 12 09:43:16 SAMT 2015

pero no he encontrado un comando para doblarlo.


Ansible actualmente no soporta esto. Si observa el código fuente de los comandos ansible o ansible-playbook , verá que el inventario se carga primero y luego el objeto de inventario pasa al comando ansible que ejecuta la tarea o playbook especificados. Mover el procesamiento del inventario para que ocurra dentro de los manejadores de tareas / playbook probablemente sería una tarea bastante importante por varias razones.

Lo mejor que puedes hacer cuando haces algo como esto es simplemente dividir tu libro de jugadas en dos y envolver sus llamadas en un script de shell que solo debes invocar una vez.


Con Ansible 2.0+, puedes actualizar tu inventario a mitad del juego ejecutando la task :

- meta: refresh_inventory


Echa un vistazo a add_host .

Agrega un host (y, alternativamente, un grupo) al inventario en memoria de ansible-playbook


Encontré que el meta: refresh_inventory es insuficiente.
Tuve que agregar una llamada explícita a ec2.py --refresh-cache primero.

- name: refresh inventory hosts: localhost connection: local gather_facts: False tasks: - name: Refresh EC2 cache command: /etc/ansible/ec2.py --refresh-cache - name: Refresh in-memory EC2 cache meta: refresh_inventory