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.
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
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
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
.
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).