vars tower example commands ansible ansible-playbook

tower - execute ansible yaml



¿Cómo continuar la ejecución en una tarea fallida después de corregir el error en el libro de jugadas? (3)

Al escribir y depurar playbooks de Ansible, el flujo de trabajo típico es el siguiente:

  1. ansible-playbook ./main.yaml
  2. Playbook falla en alguna tarea
  3. Arregle esta tarea y repita la línea 1, esperando que todas las tareas anteriores se ejecuten nuevamente. Que lleva mucho tiempo

Idealmente, me gustaría reanudar la ejecución en tareas fallidas, tener inventario y todos los hechos recopilados por tareas anteriores. ¿Es posible? ¿Cómo hacer que la escritura / depuración del libro de jugadas sea más rápida?


Echa un vistazo a http://docs.ansible.com/playbooks_startnstep.html . Si desea comenzar a ejecutar su libro de jugadas en una tarea en particular, puede hacerlo con la opción --start-at-task :

ansible-playbook playbook.yml --start-at-task="install packages"

Lo anterior comenzará a ejecutar su libro de jugadas en una tarea llamada "instalar paquetes" .

Alternativamente, eche un vistazo a esta respuesta anterior ¿Cómo ejecutar solo una tarea en el libro de jugadas ansible?

Finalmente, cuando una jugada falla, generalmente te da algo en la línea de:

PLAY RECAP ******************************************************************** to retry, use: --limit @/home/user/site.retry

Utilice ese comando --limit y debería volver a intentarlo desde la tarea fallida.


Futuro Futuro lectores:

A partir de Ansible 2.4.2.0 --start-at-task funciona para tareas definidas en roles que creé.

El equipo ansible no está dispuesto a abordar este problema, le sugieren que mantenga sus roles idempotentes y reproduzca toda la obra, no tengo tiempo para esto. En mis roles, no estoy usando una gran cantidad de datos como @JeremyWhiting, así que para mí puedo usar esta función de --start-at-task .

Sin embargo, esta es una tarea manual, así que escribí algunas rpm ansibles y agregué una función de "Reanudar" que sigue estos pasos básicos:

  • Habilite el registro ansible a través de /etc/ansible/ansible.cfg (comentar log_path)
  • Borrar el registro antes de cada ejecución
  • Después de una falla, la función "Reanudar" agrupa este registro para la última línea de "TAREA" y usa sed para obtener lo que está dentro de "[]"
  • Luego simplemente llama a la última ejecución, con --start-at-task = "$ start_at_task"
  • Asegúrese de tener "any_errors_fatal: true" en sus roles para detener la jugada en la tarea fallida desde la que desea reanudar

El equipo ansible no está dispuesto a crear esta característica básica (y muy útil), por lo que la única opción es hackearla mediante algunos scripts de bash.


Futuros lectores:

--limit @/home/user/site.retry no ayudaría en tal escenario, el .retry solo almacena el host fallido y nada más, por lo que solo ejecutará todas las tareas contra hosts fallidos.

Si está utilizando la última versión (Ansible 2.x), --start-at-task no funciona para las tareas definidas dentro de los roles .

Puede lograr un efecto similar simplemente usando el indicador --step , por ejemplo: ansible-playbook playbook.yml --step . El paso le pregunta antes de ejecutar cada tarea y puede elegir (N)o/(y)es/(c)ontinue .

Con este enfoque, ejecuta tareas selectivamente cuando es necesario y también continúa desde el punto donde falló, después de las correcciones.