web-dev-qa-db-fra.com

Le gestionnaire Ansible n'exécute pas plusieurs tâches de gestionnaire

Nous avons un rôle Ansible qui doit exécuter trois tâches dans le handlers/main.yml fichier de tâches, mais il n'exécute que la première tâche. Comment le forcer à exécuter les deux autres tâches? J'ai le drapeau ignore activé si la première tâche échoue.

Le tasks/main.yml le fichier ressemble à:

- name: openfire | Copy plugins into openfire/plugins
  copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/plugins/{{ item }}
  with_items:
   - x.jar
   - y.jar
  Sudo: yes
  Sudo_user: ${Tomcat_user}
  notify: restart openfire

- name: openfire | Copy jars into openfire/lib
  copy: src={{ srcdir }}/xmpp/{{ item }} dest=${bindir}/openfire/lib/{{ item }}
  with_items:
   - a.jar
   - b.jar
  Sudo: yes
  Sudo_user: ${Tomcat_user}
  notify: restart openfire

Le handlers/main.yml le fichier ressemble à:

- name: restart openfire
  service: name=openfire state=stopped
  ignore_errors: true
  Sudo: yes

- name: restart openfire
  file: path=/var/run/openfire.pid state=absent
  Sudo: yes

- name: restart openfire
  service: name=openfire state=restarted enabled=yes
  Sudo: yes

Seule la première tâche du gestionnaire (arrêter Openfire) s'exécute.

21
Nova S.

Depuis Ansible 2.2, vous pouvez désormais notifier plusieurs gestionnaires en même temps en utilisant la directive listen:

- name: stop openfire
  listen: restart openfire
  service: name=openfire state=stopped
  ignore_errors: true
  Sudo: yes

- name: remove openfire pid file
  listen: restart openfire
  file: path=/var/run/openfire.pid state=absent
  Sudo: yes

- name: restart openfire
  listen: restart openfire
  service: name=openfire state=restarted enabled=yes
  Sudo: yes
19
Xiong Chiamiov

Il est possible pour le gestionnaire d'appeler une autre notification. Plusieurs appels de notification sont également autorisés:

---
- name: restart something
  command: shutdown.sh 
  notify:
    - wait for stop
    - start something
    - wait for start

- name: wait for stop
  wait_for: port={{port}} state=stopped

- name: start something
  command: startup.sh

- name: wait for start
  wait_for: port={{port}} state=started
20
iTake

Il est peut-être trop tard, car votre message date de janvier, mais ... pourquoi nommez-vous de manière identique tous les différents gestionnaires? Il est supposé que les gestionnaires soient appelés dans les tâches par leur name, donc vous devrez peut-être les nommer différemment. Essayez de changer le fichier des gestionnaires en quelque chose comme ceci:

- name: stop openfire
  service: name=openfire state=stopped
  ignore_errors: true
  Sudo: yes

- name: remove openfire pid
  file: path=/var/run/openfire.pid state=absent
  Sudo: yes

- name: restart openfire
  service: name=openfire state=restarted enabled=yes
  Sudo: yes

Quoi qu'il en soit, je suis d'accord avec Mxx au point que ce fichier de gestionnaires est assez étrange. Cela devrait suffire avec un state=restarted.

9
José L. Patiño

La façon dont l'exemple de code ci-dessus utilise notify dans Ansible n'est pas officiellement prise en charge, donc je ne suis pas surpris que cela ne fonctionne pas (et je serais surpris si c'était le cas vraiment fonctionnant) . Dans votre cas particulier, en utilisant une tâche dans votre playbook ou un gestionnaire qui utilise simplement state=restarted pour redémarrer le service, serait une meilleure option:

- service: name=openfire state=restarted enabled=yes

Cependant, si vous faites devez exécuter plusieurs gestionnaires à la suite d'une opération, la meilleure façon de le faire serait de notifier chaque commande distincte dans une chaîne. Notez que cela indique presque toujours un problème plus profond ... mais de temps en temps, j'ai dû informer un autre gestionnaire après la fin d'un certain gestionnaire, comme ceci:

# Inside handlers/main.yml:
- name: import database
  mysql_db: name=database state=import target=/path/to/dump.sql
  notify: run Shell script

- name: run Shell script
  Shell: /path/to/some/Shell/script.sh

Cela devrait être assez rare, mais je ne pense pas que ce soit une option trop mauvaise pour certains scénarios (dans mon cas, j'ai dû importer un vidage de base de données, puis exécuter un script Shell une fois terminé, et la meilleure façon de le faire L'opération idempotente devait informer le import database gestionnaire au lieu d'essayer de faire l'importation directement dans mon manuel).

8
geerlingguy