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:
-
ansible-playbook ./main.yaml
- Playbook falla en alguna tarea
- 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.