Sempre acionar a execução do manipulador no Ansible

33

Estou usando o Ansible para provisionar meu servidor de desenvolvimento.

Quero que ele sempre inicie alguns serviços para mim. Eu tenho manipuladores para esse fim, mas qual é a melhor maneira de acionar a execução do manipulador sem condição, por exemplo, fazê-lo sempre funcionar?

Algo assim:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Slava Fomin II
fonte
6
Se você deseja que uma tarefa sempre seja executada, você deve torná-la uma tarefa e não um manipulador.
12122 Jordan
@ Jordânia - às vezes você pode querer ter um manipulador que é acionado condicionalmente na maioria dos cenários, exceto neste particular.
silverdr

Respostas:

61

Se você absolutamente precisar acionar um manipulador toda vez, aqui estão duas opções:

1) execute um comando noop shell que sempre reportará como alterado

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

2) use debug junto com o changes_when: para acionar um manipulador

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

Também é importante observar a opção 1 e o modo de verificação: check_mode: noconvém usar o Ansible versão 2.2 ou superior ou always_run: yesversões anteriores a essa para que a tarefa não seja ignorada no modo de verificação. No meu teste manual, parece que os manipuladores permanecem no modo de verificação, mas tenha cuidado, pois seu caso pode ser diferente.

jarv
fonte
7
Hoje em dia, você pode `--force-handlers executar manipuladores mesmo que uma tarefa falhe` #
conny
5
Sim entanto, que vai obrigar todos os manipuladores para executar
Jarv
Eu achei este post útil sobre o status alterado, que me levou até aqui. serverfault.com/a/799282/173002 . ty.
sonjz
Obrigado, usei a opção 2 e a changed_whencom mais lógica para implementar uma tarefa não idempotente [que pode ser chamada mais de uma vez em alguns casos] como manipulador e não como tarefa.
Sammitch 29/11
17

O Ansible fornece várias opções para forçar manipuladores:

1) Para forçar sempre todos os manipuladores, execute ansible-playbook playbook.yml --force-handlers, conforme documentado aqui: https://github.com/ansible/ansible/issues/4777

2) Para forçar manipuladores que foram notificados em um ponto específico dentro de um manual, você pode usar uma meta tarefa https://docs.ansible.com/playbooks_intro.html :

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

3) No entanto, parece que você deseja apenas garantir que um serviço esteja sendo executado ou reiniciado, independentemente do resultado de outra tarefa. Nesse caso, não use um manipulador, use uma nova tarefa que chame o servicemódulo da 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
fonte
11
O problema com (3) é que alguém pode ter várias tarefas que notificam o manipulador e não quero que o manipulador execute (reiniciando o serviço) várias vezes.
Jonathan Hartley
Várias tarefas podem notificar o mesmo manipulador, e o manipulador será executado apenas uma vez. Esse é o objetivo dos manipuladores.
quer
Ei, Jeff. Esta resposta é sobre não usar manipuladores, especificando todas as ações usando apenas tarefas.
Jonathan Hartley
Sinto muito, mas ainda não entendo o caso de uso que você está tentando resolver ... Talvez abra uma nova pergunta com um exemplo do que você está tentando realizar? Se você adicionar um comentário com um link, tentarei responder.
quer
Eu não preciso de uma nova pergunta. O OQ perguntou "Como posso garantir que um manipulador SEMPRE execute", e esta resposta, parte 3, sugeriu "Em vez disso, use tarefas", e meu comentário aponta "Sua tarefa pode ser executada várias vezes em algumas circunstâncias".
Jonathan Hartley
6

Reiniciar um serviço é uma coisa; garantir que esteja em execução é outra. Se você quiser ansibleter certeza de que nginxestá em execução, faça o seguinte:

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