Ansible: Share Handler between Roles

In Ansible gibt es sog. „Handler“ – Tasks. Diese werden von anderen Tasks getriggered, insofern man sie benötigt.

Ein Beispiel für eine solche Aktion ist ein Service-Restart nach der Installation eines Paketes oder nach einem Update der Konfiguration eines Services.

roles/httpd/tasks/main.yaml

-name: Install httpd
   package:
     name: httpd
     state: latest

- name: Update httpd config 
    template: 
      src: httpd.conf.j2
      dest: /etc/httpd/httpd.conf
  notify: restart httpd

roles/httpd/handlers/main.yaml

- name: restart httpd
   service:
     name: httpd
     state: restarted

Der „notify“ Befehl triggered dabei den Handler aus dem zur Role gehörenden Handler-Verzeichnis.

Hat man in seinem Playbook mehrere Rollen, die denselben Handler aufrufen möchten, so kann man entweder für jede Rolle die Handler neu schreiben oder man greift auf folgenden Trick zurück:
Alle Handler, die geshared werden sollen, legt man einfach in einer eigenen Rolle ab:

roles/myhandlers/handlers/main.yaml

- name: restart httpd
   service:
     name: httpd
     state: restarted

- name: another shared handler 
[...]

Im meta-Verzeichnis einer Rolle lassen sich Abhängigkeiten zu anderen Rollen definieren. Diese werden dann bei der Ausführung der „Master“-Rolle geladen.
Das schließt auch die Handler der jeweiligen „Slaves“ mit ein.

roles/httpd/meta/main.yaml

---
dependencies:
- role: myhandlers

Der restlich Code ändert sich nicht, man kann den Handler wie oben beschrieben ganz normal einbinden.

- name: Install httpd
  package:
     name: httpd
     state: latest

- name: Update httpd config
  template:
     src: httpd.conf.j2
     dest: /etx/httpd/httpd.conf
   notify: restart httpd
The following two tabs change content below.
Bernhard Hopfenmüller

Bernhard Hopfenmüller

Bernhard Hopfenmüller

Latest posts by Bernhard Hopfenmüller (see all)