In response to a change, I have multiple related tasks that should run. How do I write an Ansible handler with multiple tasks?
For example, I would like a handler that restarts a service only if already started:
- name: Restart conditionally
shell: check_is_started.sh
register: result
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
Edit: If you have Ansible 2.2 or above, use mkadan's answer. The answer below does not work with newer versions of Ansible. Also note that as per Enis Afgan's comment below, due to a bug, this answer does not work with Ansible versions between 2.0.2 and 2.1.2.
As of Ansible 2.0, you can use an include action in your handler to run multiple tasks.
For example, put your tasks in a separate file
restart_tasks.yml
(if you use roles, that would go into the tasks subdirectory, not in the handlers subdirectory):Your handler would then simply be:
Source: issue thread on github: https://github.com/ansible/ansible/issues/14270
In your handler file, chain the different steps together using notify.
Then refer to it from a task with
notify: Restart conditionally
.Note that you can only notify to handlers below the current one. So for example,
Restart conditionally step 2
can't notifyRestart conditionally
.Source: #ansible at irc.freenode.net. I'm unsure whether this will continue to work in the future as it's not mentioned as a feature in the official documentation.
There is proper solution to this problem as of Ansible 2.2.
handlers can also “listen” to generic topics, and tasks can notify those topics as follows:
This use makes it much easier to trigger multiple handlers. It also decouples handlers from their names, making it easier to share handlers among playbooks and roles
Specifically to the question, this should work:
and in the task, notify handlers via 'Restart processes'
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change