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

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.


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.