'Order of notify handlers

I have a task:

- name: uploads docker configuration file
  template:
    src: 'docker.systemd.j2'
    dest: '/etc/systemd/system/docker.service'
  notify:
    - daemon reload
    - restart docker

in Ansible playbook's documentation, there is a sentence:

Notify handlers are always run in the order written.

So, it is expected, that daemon reload will be ran before restart docker, but in logs, i have:

TASK [swarm/docker : uploads docker configuration file] ************************
…
NOTIFIED HANDLER daemon reload
NOTIFIED HANDLER restart docker
…
RUNNING HANDLER [swarm/docker : restart docker] ********************************
…
RUNNING HANDLER [swarm/docker : daemon reload] *********************************
…

There are no more "NOTIFIED HANDLER" in logs. Can anyone explain, what i'm doing wrong? :(



Solution 1:[1]

I think you may have “restart docker” listed before “daemon reload” in your handlers file.

That part of the ansible documentation is a bit misleading. It means that handlers are executed in the order they are written in the handlers file, not the order they are notified.

This is little more clear in the documentation:

Handlers always run in the order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.

Solution 2:[2]

I just figured out that I can have handlers call other handlers.

Example task:

- name: Configure Apache
  copy: src=apache-azkaban.conf dest=/etc/apache2/sites-enabled/azkaban.conf
  notify:
   - a2enmod proxy
   - a2enmod proxy_http

In my handlers/main.yml:

- name: a2enmod proxy
  shell: a2enmod proxy
  notify:
    - restart apache2

- name: a2enmod proxy_http
  shell: a2enmod proxy_http
  notify:
    - restart apache2

- name: restart apache2
  service: name=apache2 state=restarted

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 l0b0
Solution 2