handler - simple - ¿Cómo escribo un controlador Ansible con varias tareas?
playbooks examples ansible (3)
En respuesta a un cambio, tengo varias tareas relacionadas que deberían ejecutarse. ¿Cómo escribo un controlador Ansible con varias tareas?
Por ejemplo, me gustaría un controlador que reinicie un servicio solo si ya se inició:
- name: Restart conditionally
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
A partir de Ansible 2.0, puede usar una acción de inclusión en su controlador para ejecutar múltiples 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):
- name: Restart conditionally step 1
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Su controlador sería simplemente:
- name: Restart conditionally
include: restart_tasks.yml
Fuente: tema de problema en github: https://github.com/ansible/ansible/issues/14270
En su archivo de controlador, encadene los diferentes pasos juntos mediante la notificación.
- name: Restart conditionally
debug: msg=Step1
changed_when: True
notify: Restart conditionally step 2
- name: Restart conditionally step 2
debug: msg=Step2
changed_when: True
notify: Restart conditionally step 3
- name: Restart conditionally step 3
debug: msg=Step3
Luego refiérase a él desde una tarea con
notify: Restart conditionally
.
Tenga en cuenta que solo puede notificar a los manejadores por debajo del actual.
Entonces, por ejemplo,
Restart conditionally step 2
no puede notificar
Restart conditionally
.
Fuente: #ansible en irc.freenode.net. No estoy seguro de si esto continuará funcionando en el futuro, ya que no se menciona como una característica en la documentación oficial.
Hay una solución adecuada a este problema a partir de Ansible 2.2.
los manejadores 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 múltiples manejadores. También desacopla los controladores de sus nombres, lo que facilita compartir controladores entre libros de jugadas y roles
Específicamente a 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 manejadores a través de ''Reiniciar procesos''
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change