Globale Handler in Ansible

Globale Handler in Ansible

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_tasksmuss 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.ymlmit 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.

verwandte Informationen