web-dev-qa-db-fra.com

Toujours déclencher l'exécution du gestionnaire dans Ansible

J'utilise Ansible pour provisionner mon serveur de développement.

Je veux qu'il démarre toujours certains services pour moi. J'ai des gestionnaires à cet effet, mais quelle est la meilleure façon de déclencher l'exécution du gestionnaire sans condition, par exemple faire fonctionner toujours?

Quelque chose comme ça:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
36
Slava Fomin II

Si vous devez absolument déclencher un gestionnaire à chaque fois, voici deux options:

1) Exécutez une commande Noop Shell qui sera toujours signalée comme modifiée

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

2) utilisez le débogage avec changed_when: pour déclencher un gestionnaire

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

Aussi de note pour l'option 1 et le mode de vérification: vous pouvez utiliser check_mode: no si vous utilisez Ansible version 2.2 ou supérieure ou always_run: yes si vous utilisez des versions antérieures à celle-ci afin que la tâche ne soit pas ignorée en mode de vérification. D'après mes tests manuels, il semble que les gestionnaires restent en mode de vérification, mais faites attention car votre cas peut différer.

61
jarv

Ansible propose plusieurs options pour forcer les gestionnaires:

1) Pour toujours forcer tous les gestionnaires, exécutez ansible-playbook playbook.yml --force-handlers, comme indiqué ici: https://github.com/ansible/ansible/issues/4777

2) Pour forcer les gestionnaires qui ont été notifiés à un point spécifique d'un playbook, vous pouvez utiliser une méta-tâche https://docs.ansible.com/playbooks_intro.html :

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

3) Cependant, il semble que vous souhaitiez simplement vous assurer qu'un service est en cours d'exécution ou redémarré, quel que soit le résultat d'une autre tâche. Dans ce cas, n'utilisez pas de gestionnaire, utilisez une nouvelle tâche qui appelle le module service d'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
18
Jeff Widman

Redémarrer un service est une chose; s'assurer qu'il fonctionne est une autre. Si vous voulez que ansible s'assure que nginx est en cours d'exécution, procédez comme suit:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
6