Existe una solución adecuada a este problema a partir de Ansible 2.2.
Los controladores también pueden "escuchar" temas genéricos, y las tareas pueden notificar esos temas de la siguiente manera:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
Este uso hace que sea mucho más fácil activar varios controladores. También desacopla a los controladores de sus nombres, lo que facilita compartir controladores entre libros de jugadas y roles.
Específicamente para la pregunta, esto debería funcionar:
- name: Check if restarted
shell: check_is_started.sh
register: result
listen: Restart processes
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
listen: Restart processes
y en la tarea, notificar a los controladores a través de 'Reiniciar procesos'
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
Notify handlers are always run in the same order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.
En su archivo de controlador, encadene los diferentes pasos juntos usando notificar.
Luego, consúltelo desde una tarea con
notify: Restart conditionally
.Tenga en cuenta que solo puede notificar a los controladores por debajo del actual. Entonces, por ejemplo,
Restart conditionally step 2
no puedo notificarRestart conditionally
.Fuente: #ansible en irc.freenode.net. No estoy seguro de si esto seguirá funcionando en el futuro, ya que no se menciona como una característica en la documentación oficial.
fuente
notify
etiquetas diferentes para aquellas que quizás no desee ejecutar si falla un controlador anterior es una buena manera de "arreglar" esto si no quiere que sea así.Editar: si tiene Ansible 2.2 o superior, use la respuesta de mkadan. La respuesta a continuación no funciona con las versiones más recientes de Ansible. También tenga en cuenta que, según el comentario de Enis Afgan a continuación, debido a un error, esta respuesta no funciona con las versiones de Ansible entre 2.0.2 y 2.1.2.
A partir de Ansible 2.0, puede utilizar una acción de inclusión en su controlador para ejecutar varias tareas.
Por ejemplo, coloque sus tareas en un archivo separado
restart_tasks.yml
(si usa roles, eso iría al subdirectorio de tareas, no al subdirectorio de controladores):Su controlador sería simplemente:
Fuente: tema de emisión en github: https://github.com/ansible/ansible/issues/14270
fuente
include
porinclude_tasks
.