En réponse à un changement, plusieurs tâches connexes doivent être exécutées. Comment écrire un gestionnaire Ansible avec plusieurs tâches?
Par exemple, je voudrais un gestionnaire qui redémarre un service uniquement s'il est déjà démarré:
- name: Restart conditionally
Shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Il existe une solution appropriée à ce problème à partir de Ansible 2.2.
les gestionnaires peuvent également "écouter" les sujets génériques et les tâches peuvent les notifier comme suit:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart Apache
service: name=Apache state=restarted
listen: "restart web services"
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
Cette utilisation facilite beaucoup le déclenchement de plusieurs gestionnaires. Il sépare également les gestionnaires de leurs noms, ce qui facilite le partage des gestionnaires entre les playbooks et les rôles.
En particulier à la question, cela devrait fonctionner:
- name: Check if restarted
Shell: check_is_started.sh
register: result
listen: Restart processes
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
listen: Restart processes
et dans la tâche, notifier les gestionnaires via 'Redémarrer les processus'
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
Dans votre fichier de gestionnaire, enchaînez les différentes étapes à l’aide de notify.
- name: Restart conditionally
debug: msg=Step1
changed_when: True
notify: Restart conditionally step 2
- name: Restart conditionally step 2
debug: msg=Step2
changed_when: True
notify: Restart conditionally step 3
- name: Restart conditionally step 3
debug: msg=Step3
Puis faites-le à partir d'une tâche avec notify: Restart conditionally
.
Notez que vous ne pouvez informer que les gestionnaires situés en dessous du gestionnaire actuel. Ainsi, par exemple, Restart conditionally step 2
ne peut pas notifier Restart conditionally
.
Source: #ansible sur irc.freenode.net. Je ne sais pas si cela continuera à fonctionner à l'avenir car ce n'est pas mentionné dans les documents officiels.
À partir de Ansible 2.0, vous pouvez utiliser une action include dans votre gestionnaire pour exécuter plusieurs tâches.
Par exemple, placez vos tâches dans un fichier séparé restart_tasks.yml
(si vous utilisez des rôles, cela ira dans le sous-répertoire tâches, et non dans le sous-répertoire des gestionnaires):
- name: Restart conditionally step 1
Shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Votre gestionnaire serait alors simplement:
- name: Restart conditionally
include: restart_tasks.yml
Source: fils de discussion sur github: https://github.com/ansible/ansible/issues/1427