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
Bernhard Hopfenmüller
Neueste Artikel von Bernhard Hopfenmüller (alle ansehen)
- Ansible Automation Platform - 24. Mai 2022
- ATIX Weekly Snippet – Teil 4 - 27. August 2018
- ATIX Weekly Snippet – Teil 2 - 28. Juni 2018