subgroups simple playbooks playbook files examples handler ansible

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