The initial problem I was trying to solve had to do with a reboot role. Although it was the last role listed, once it ran the connection would be broken and then none of the notified tasks from previous roles would run.
Under normal circumstances, handlers are run after all the roles. One idea I had was to have to reboot role contain a trivial task, which would notify a handler that contained the actual reboot task. Presumably as the last task notified, it would run last.
While I was looking at ways to do this, I discovered Ansible meta actions:
Ansible Documentation: Meta Module
The flush_handlers
action looked like just what I needed:
meta: flush_handlers
I tried adding that to my reboot task so that it would run all of the previously notified handlers:
- name: Rebooting ...
command: shutdown -r now "Ansible says: Time for a reboot"
meta: flush_handlers
This produced an error:
ERROR! conflicting action statements
As I looked at the documentation a little more closely, I saw that the examples have meta
as a separate task, not part of an existing task. I missed that at first glance because of the lack of line spacing in the examples, e.g. compare:
- template:
src: new.j2
dest: /etc/config.txt
notify: myhandler
- name: force all notified handlers to run at this point, not waiting for normal sync points
meta: flush_handlers
to
- template:
src: new.j2
dest: /etc/config.txt
notify: myhandler
- name: force all notified handlers to run at this point, not waiting for normal sync points
meta: flush_handlers
I updated my reboot task accordingly:
- name: Force handlers to run before rebooting
meta: flush_handlers
- name: Rebooting ...
command: shutdown -r now "Ansible says: Time for a reboot"
I tested the playbook with the revised role and confirmed that all notified handlers from previous roles ran before the systems rebooted.
oh fooey! i was hoping it was a how to on building/constructing the device itself. peace! 😉