Ansible benachrichtigen Handler in einer anderen Rolle

73

Kann ich den Handler in einer anderen Rolle benachrichtigen? Was soll ich tun, damit ansible es findet?

Der Anwendungsfall ist, z. B. möchte ich einen Dienst konfigurieren und ihn dann neu starten, wenn er geändert wird. Unterschiedliche Betriebssysteme müssen wahrscheinlich unterschiedliche Dateien bearbeiten, und selbst das Dateiformat kann unterschiedlich sein. Daher möchte ich sie in verschiedene Rollen einteilen (da das Dateiformat unterschiedlich sein kann, kann dies nicht durch Festlegen von group_vars erfolgen). Der Neustart des Dienstes erfolgt jedoch über das serviceModul. Deshalb möchte ich den Handler in eine commonRolle versetzen .

Ist das sowieso zu erreichen? Vielen Dank.

Kan Li
quelle
Haben Sie eine Lösung gefunden?
Robert

Antworten:

74

Sie können auch Handler einer Abhängigkeitsrolle aufrufen . Kann sauberer sein als das Einfügen von Dateien oder das explizite Auflisten von Rollen in ein Playbook, nur zum Zweck der Beziehung zwischen Rollen. Z.B:

  • Rollen / meine-Handler / Handler / main.yml

    ---
    - name: nginx restart
      service: >
        name=nginx
        state=restarted
    
  • Rollen / my-other / meta / main.yml

    ---
    dependencies:
    - role: my-handlers
    
  • Rollen / meine-andere / Aufgaben / main.yml

    ---
    - copy: >
        src=nginx.conf
        dest=/etc/nginx/
      notify: nginx restart
    
Berühmte Garkin
quelle
6
Es funktioniert nicht bei mir. Ich habe es mit Ansible-Playbook versucht v1.9.0.1.
Dgellow
9
Leider sind auch in 2.0 Handling Events ernsthaft kaputt. Ich fülle habe einige Fehler auf , dass: o github.com/ansible/ansible/issues/11694 (Include der Handler tut nichts, auch Stille , wenn die Datei nicht existiert) o github.com/ansible/ansible/issues/11696 (ansible 2.0 yum und dnf Module lösen keine Benachrichtigungen aus) o github.com/ansible/ansible/issues/11766 (Bei Benachrichtigung ist kein Handler vorhanden)
Hubbitus
4
Dies ist ein ausgezeichneter Ansatz. Die Dokumente hier ( docs.ansible.com/ansible/playbooks_roles.html#role-dependencies ) wären hilfreicher, wenn ausdrücklich erwähnt würde, dass abhängige Rollen ihre Handler enthalten.
Thisjustin
6
Dies würde auch Aufgaben ausführen, die in der my_handlersRolle definiert sind .
mdh
2
Nun, ich habe Rolle1 als Abhängigkeit von Rolle2, aber ich kann die Handler von Rolle1 nicht von Rolle2 abfeuern. Ich erhalte die Fehlermeldung: "Der angeforderte Handler ... wurde weder in der Liste der Haupthandler noch in der Liste der abhörenden Handler gefunden."
Diego Augusto Molina
36

Sie sollten dies tun können, wenn Sie die Handlerdatei einschließen.

Beispiel:

handlers:
  - include: someOtherRole/handlers/main.yml 

Aber ich finde es nicht elegant.

Ein eleganterer Weg ist ein Stück, das beide Rollen verwaltet, ungefähr so:

- hosts: all
  roles:
  - role1
  - role2

Dadurch können beide Rollen andere Handler aufrufen.

Aber auch hier würde ich vorschlagen, alles in einer Rolle zu machen und Dateien zu trennen und ein bedingtes Include zu verwenden: http://docs.ansible.com/playbooks_conditionals.html#conditional-imports

hoffentlich hilft das

DomaNitro
quelle
1
am 2.6.12 werden Handler nicht implizit gemeinsam genutzt. Zumindest in meinem Fall.
Deil
1
Im Jahr 2014 sagte Benutzer mpdehaan : "Es ist möglich, einen Handler zweimal ohne Probleme zu definieren, zum Beispiel" Apache neu starten ", und das System wird die neueste Definition übernehmen." Meine Tests (Ansible 2.9.4) zeigen jedoch, dass, wenn Handler in verschiedenen Rollen definiert sind, beide ausgeführt werden, aber wenn sie nur einmal definiert werden, auch wenn sie in einer anderen Rolle sind, werden sie immer noch ausgeführt, also da sie sind global. Es ist nicht erforderlich, Handler aus einer anderen Rolle zu importieren.
Bitinerant
9

Sie können zusätzliche Handler aus der YourRole/handlers/main.ymlDatei importieren, indem Sie verwenden import_tasks.

Also, wenn MyRoleBedarf Handler in einige nennen OtherRole, roles/MyRole/handlers/main.ymlwird wie folgt aussehen:

- import_tasks: roles/OtherRole/handlers/main.yml

Natürlich roles/MyRole/handlers/main.ymlkönnen auch zusätzliche Handler enthalten sein.

Auf diese Weise kann ansible Handler aus dem korrekt importieren und ausführen , wenn ich MyRoleAufgaben OtherRoleausführen möchte, ohne Aufgaben von der auszuführenOtherRole

Dima L.
quelle
4

Ich hatte ein ähnliches Problem, musste aber in den anderen abhängigen Rollen viele Maßnahmen ergreifen.

Anstatt den Handler aufzurufen, setzen wir eine Tatsache wie folgt:

- name: install mylib to virtualenv
  pip: requirements=/opt/mylib/requirements.txt virtualenv={{ mylib_virtualenv_path }}
  sudo_user: mylib
  register: mylib_wheel_upgraded

- name: set variable if source code was upgraded
  set_fact:
    mylib_source_upgraded: true
  when: mylib_wheel_upgraded.changed

Dann anderswo in einer anderen Rolle:

- name: restart services if source code was upgraded
  command: /bin/true
  notify: restart mylib server
  when: mylib_source_upgraded
Stackdump
quelle
7
Es ist nicht erforderlich, eine Tatsache registerfestzulegen. Eine Variable, die durchgesetzt wird, hat dieselbe Lebensdauer wie eine Tatsache.
Luke Antins
1
@LukeAntins-Variablen, die über das Register festgelegt werden, durchlaufen alle "Cruft", die das Modul für nützlich hält. Das Festlegen einer von Ihnen definierten Variablen auf einen bekannten Wert ist viel vorhersehbarer. Es entkoppelt Ihr Playbook von bestimmten Modulimplementierungen und von der Verwendung bestimmter Module zum Generieren der Variablen.
DylanYoung