Siempre desencadenar la ejecución del controlador en Ansible

33

Estoy usando Ansible para aprovisionar mi servidor de desarrollo.

Quiero que siempre comience algunos servicios para mí. Tengo controladores para este propósito, pero ¿cuál es la mejor manera de activar la ejecución del controlador sin condiciones, por ejemplo, hacer que siempre funcione?

Algo como esto:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Slava Fomin II
fuente
66
Si desea que una tarea se ejecute siempre, debe hacerla una tarea en lugar de un controlador.
Jordan
@ Jordania: a veces es posible que desee tener un controlador que se active condicionalmente en la mayoría de los escenarios, excepto en este particular.
silverdr

Respuestas:

61

Si realmente necesita activar un controlador cada vez, aquí hay dos opciones:

1) ejecute un comando de shell noop que siempre informará como modificado

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2) usa la depuración junto con changed_when: para activar un controlador

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

También es importante tener en cuenta la Opción 1 y el Modo de verificación: puede usarlo check_mode: nosi usa la versión 2.2 de Ansible o superior o always_run: yessi usa versiones anteriores para que la tarea no se salte en el modo de verificación. Según mi prueba manual, parece que los controladores permanecen en modo de verificación, pero tenga cuidado ya que su caso puede diferir.

jarv
fuente
77
Hoy en día, puede `--force-handlers ejecutar controladores incluso si falla una tarea`
conny
55
Si embargo, que obligará a todos los manipuladores de correr
Jarv
esta publicación me pareció útil con respecto al estado cambiado, que me llevó aquí. serverfault.com/a/799282/173002 . ty.
sonjz
Gracias, utilicé la opción 2 y una changed_whencon más lógica para implementar una tarea no idempotente [que se puede invocar más de una vez en algunos casos] como un controlador en lugar de una tarea.
Sammitch
17

Ansible ofrece varias opciones para forzar manejadores:

1) Para forzar siempre a todos los manejadores, ejecute ansible-playbook playbook.yml --force-handlers, como se documenta aquí: https://github.com/ansible/ansible/issues/4777

2) Para forzar a los controladores que han sido notificados en un punto específico dentro de un libro de jugadas, puede usar una metatarea https://docs.ansible.com/playbooks_intro.html :

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3) Sin embargo, parece que solo quiere asegurarse de que un servicio se esté ejecutando o reiniciando, independientemente del resultado de otra tarea. En ese caso, no use un controlador, use una nueva tarea que llame al servicemódulo de Ansible : http://docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted
Jeff Widman
fuente
1
El problema con (3) es que uno puede tener varias tareas que notifican al controlador, y no quiero que el controlador se ejecute (reiniciando el servicio) varias veces.
Jonathan Hartley
Varias tareas pueden notificar al mismo controlador, y el controlador solo se ejecutará una vez. Ese es el objetivo de los controladores.
Jeff Widman
Hola jeff Esta respuesta se trata de no usar controladores, especificando todas las acciones solo usando tareas.
Jonathan Hartley
Lo siento, me temo que todavía no entiendo el caso de uso que estás tratando de resolver ... ¿Quizás abrir una nueva pregunta con un ejemplo de lo que estás tratando de lograr? Si agrega un comentario con un enlace, intentaré responderlo.
Jeff Widman
No necesito una nueva pregunta El OQ preguntó "¿Cómo puedo asegurarme de que un controlador SIEMPRE se ejecuta", y esta respuesta, parte 3, sugirió "Usar tareas en su lugar", y mi comentario señala "Su tarea podría ejecutarse varias veces en algunas circunstancias".
Jonathan Hartley
6

Reiniciar un servicio es una cosa; asegurarse de que se está ejecutando es otra. Si desea ansibleasegurarse de que se nginxestá ejecutando, haga esto:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Antonis Christofides
fuente