Attiva sempre l'esecuzione del gestore in Ansible


33

Sto utilizzando Ansible per eseguire il provisioning del mio server di sviluppo.

Voglio che inizi sempre alcuni servizi per me. Ho gestori per questo scopo, ma qual è il modo migliore per innescare l'esecuzione di gestori senza condizioni, ad esempio farlo funzionare sempre?

Qualcosa come questo:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

6
Se si desidera che un'attività venga sempre eseguita, è necessario trasformarla in un'attività anziché in un gestore.
Giordania,

@Jordan - a volte potresti voler avere un gestore che è attivato in modo condizionale nella maggior parte degli scenari tranne questo in particolare.
Silverdr,

Risposte:


61

Se devi assolutamente attivare un gestore ogni volta, ecco due opzioni:

1) esegui un comando noop shell che riporterà sempre come modificato

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

2) usa il debug insieme a changed_when: per attivare un gestore

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

Anche di nota per l'opzione 1 e di controllo Modalità: Si consiglia di utilizzare check_mode: nose si utilizza la versione 2.2 o superiore Ansible o always_run: yesse si utilizza versioni precedenti rispetto a quello in modo che l'operazione non venga saltato in modalità di controllo. Dal mio test manuale sembra che i gestori rimangano in modalità di controllo, ma fai attenzione perché il tuo caso potrebbe differire.


7
Oggi puoi `--force-handlers eseguire gestori anche se un'attività fallisce`
conny

5
Sì, questo costringerà tutti i gestori a correre
jarv

ho trovato questo post utile per quanto riguarda lo stato modificato, che mi porta qui. serverfault.com/a/799282/173002 . ty.
Sonjz,

Grazie, ho usato l'opzione 2 e changed_whencon più logica per implementare un compito non idempotente [che può essere richiamato più di una volta in alcuni casi] come un gestore piuttosto che un compito.
Sammitch,

17

Ansible offre diverse opzioni per forzare i gestori:

1) Per forzare sempre tutti i gestori, eseguire ansible-playbook playbook.yml --force-handlers, come documentato qui: https://github.com/ansible/ansible/issues/4777

2) Per forzare i gestori che sono stati informati in un punto specifico all'interno di un playbook, è possibile utilizzare una meta attività https://docs.ansible.com/playbooks_intro.html :

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

3) Tuttavia, sembra che tu voglia solo assicurarti che un servizio sia in esecuzione o riavviato, indipendentemente dal risultato di un'altra attività. In tal caso, non utilizzare un gestore, utilizzare una nuova attività che chiama il servicemodulo 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
Il problema con (3) è che si potrebbero avere diverse attività che avvisano il gestore e non voglio che il gestore venga eseguito (riavviando il servizio) più volte.
Jonathan Hartley,

Più attività possono notificare lo stesso gestore e il gestore verrà eseguito una sola volta. Questo è il punto centrale dei gestori.
Jeff Widman,

Ehi Jeff. Questa risposta riguarda il non utilizzo dei gestori, specificando tutte le azioni usando solo le attività.
Jonathan Hartley,

Scusa, temo di non capire ancora il caso d'uso che stai cercando di risolvere ... Forse apri una nuova domanda con un esempio di ciò che stai cercando di realizzare? Se aggiungi un commento con un link ad esso, proverò a rispondere.
Jeff Widman,

Non ho bisogno di una nuova domanda. L'OQ ha chiesto "Come posso assicurarmi che un gestore funzioni SEMPRE", e questa risposta, parte 3, ha suggerito "Usa attività invece", e il mio commento sottolinea che il tuo compito potrebbe quindi essere eseguito più volte in alcune circostanze. "
Jonathan Hartley,

6

Il riavvio di un servizio è una cosa; assicurarsi che sia in esecuzione è un altro. Se vuoi ansibleassicurarti che nginxsia in esecuzione, fai questo:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.