Sempre aciona a execução do manipulador no Ansible

27

Estou usando o Ansible para provisionar meu servidor de desenvolvimento.

Eu quero sempre começar alguns serviços para mim. Eu tenho manipuladores para essa finalidade, mas qual é a melhor maneira de acionar a execução do manipulador sem condição, por exemplo, faz sempre funcionar?

Algo parecido com isto:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
    
por Slava Fomin II 03.08.2014 / 13:06

3 respostas

51

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

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

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

2) use depuração junto com changed_when: para acionar um manipulador

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

Também da nota para a Opção 1 e o Modo de verificação: talvez você queira usar check_mode: no se usando Ansible versão 2.2 ou superior ou always_run: yes se estiver usando versões anteriores a essa para que a tarefa não seja ignorada no modo de verificação. Do meu teste manual, parece que os manipuladores permanecem no modo de verificação, mas tenha cuidado, pois o seu caso pode ser diferente.

    
por 14.08.2014 / 22:00
15

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: link

2) Para forçar os manipuladores que foram notificados em um ponto específico de um playbook, você pode usar uma meta tarefa link :

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

3) No entanto, parece que você só quer ter certeza de que um serviço está sendo executado ou reiniciado, independentemente do resultado de outra tarefa. Nesse caso, não use um manipulador, use uma nova tarefa que chame o módulo service do Ansible: link

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
    
por 09.05.2015 / 23:28
6

Reiniciar um serviço é uma coisa; Garantir que está sendo executado é outro. Se você quiser que ansible tenha certeza de que nginx está sendo executado, faça o seguinte:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
    
por 03.08.2014 / 22:50