
Ist es möglich, in Ansible wirklich globale Handler zu haben, sodass ich den Handler von jeder Aufgabe jeder Rolle jedes Playbooks aus „benachrichtigen“ kann? Und ohne expliziten Import.
Ich möchte nur einmal einen Handler definieren (sagen wir „httpd neu starten“) und ihn dann für jede beliebige „Benachrichtigungs“-Direktive überall verfügbar haben.
Danke!
Antwort1
Sie können Ihre Handler innerhalb Ihres Spiels statt innerhalb von Rollen definieren. In einem Spiel definierte Handler wären für alle Aufgaben/Rollen in diesem Spiel verfügbar.
Sie können den Import bei Bedarf auch im Handlerbereich verwenden.
---
- hosts: all
handlers:
- import_tasks: global_handlers.yml
tasks:
- shell: echo "Hello World"
notify: some thing from global_handlers
Beachten Sie, dass Sie ein 'statisches Include' benötigen (per https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html#handlers-running-operations-on-change), import_tasks
muss also anstelle von verwendet werden include_tasks
:
Sie können keinen Handler benachrichtigen, der innerhalb eines Includes definiert ist. Ab Ansible 2.1 funktioniert dies, allerdings muss der Include statisch sein.
Antwort2
Es gibt mindestens zwei Möglichkeiten, dies zu erreichen. Mir ist jedoch nicht klar, welche Vorgehensweise die beste ist.
Lösung 1
EinsEmpfohlene Praxisbesteht darin, eine Datei nur für Handler zu erstellen und diese in Ihr Playbook einzubinden oder zu importieren (Sehen Sie die Unterschiede); auf diese Weise können alle Rollen profitieren.
Angenommen, Sie haben eine Datei myhandlers.yml
mit einem Handler zum Neustarten von Apache und einem anderen zum Neuladen von MySQLD.
Dann in Ihrem Spielbuch:
- name: Testing 123
hosts: localhost
handlers:
- name: Here are my custom common handlers
# You can also look at include_tasks: handlers.yml
import_tasks: handlers.yml
tasks:
- command: "true"
notify: restart-apache
- command: "true"
notify: restart-mysql
Lösung 2
Ein weiterer sauberer Ansatzbesteht darin, eine dedizierte Rolle zu erstellen ( roles/myhandlers/
zum Beispiel) und diese Rolle zu einer Abhängigkeit für alle anderen Rollen zu machen.
dependencies:
- myhandlers
Weitere Informationen zu AbhängigkeitenHier.