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
- Se crean nuevas instancias si es necesario
- El script de hosts carga el inventario (incluidos los datos de los servidores)
- 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