it-swarm.com.de

Ansible Handler benachrichtigen vs registrieren

Nachdem ich Ansible-Dokumente gelesen hatte, stellte ich fest, dass Handlers nur ausgelöst wird, wenn Aufgaben Änderungen melden. Beispiel:

some tasks ...
notify: nginx_restart

# our handler
- name: nginx_restart

vs

some tasks ...
register: nginx_restart

# do this after nginx_restart changes
when: nginx_restart|changed

Gibt es einen Unterschied zwischen diesen beiden Methoden? Wann sollte ich jeden von ihnen verwenden? Für mich scheint register hier mehr Funktionalität zu haben, es sei denn, mir fehlt etwas ...

51
huygn

Es gibt einige Unterschiede und was besser ist, hängt von der Situation ab.

Handler sind in der Ausgabe nur sichtbar, wenn sie tatsächlich ausgeführt wurden. Nicht benachrichtigt, es gibt keine übersprungenen Aufgaben in der Ansibles-Ausgabe. Aufgaben wurden immer ausgegeben, egal ob übersprungen, mit oder ohne Änderung ausgeführt. (außer sie werden über Tags/Skip-Tags ausgeschlossen)

Handler können von jeder Rolle aufgerufen werden. Dies ist praktisch, wenn Sie komplexere Rollen haben, die voneinander abhängen. Angenommen, Sie haben eine Rolle zum Verwalten von iptables, aber welche Regeln Sie definieren, hängt tatsächlich von anderen Rollen ab (z. B. Datenbankrolle, Redis-Rolle usw.). Jede Rolle kann ihre Regeln zu einer Konfigurationsdatei hinzufügen und am Ende benachrichtigen Sie die iptables Rolle zum erneuten Laden von Iptables, falls diese geändert wurden.

Handler werden standardmäßig am Ende des Playbooks ausgeführt. Aufgaben werden sofort dort ausgeführt, wo sie definiert sind. Auf diese Weise können Sie alle Ihre Anwendungen konfigurieren und am Ende wird der Neustart des Dienstes für alle geänderten Anwendungen pro Handler ausgelöst. Dies kann jedoch gefährlich sein. Falls Ihr Playbook nach Benachrichtigung eines Handlers fehlschlägt, wird der Handler tatsächlich nicht aufgerufen. Wenn Sie das Playbook erneut ausführen, hat der auslösende Task möglicherweise keinen geänderten Status mehr, sodass der Handler nicht benachrichtigt wird. Dies führt dazu, dass Ansible tatsächlich nicht idempotent ist. Seit Ansible 1.9.1 können Sie Ansible mit der Option --force-handler Aufrufen oder force_handlers = True In Ihrem ansible.cfg Definieren, um sogar alle angemeldeten Handler auszulösen, nachdem das Playbook fehlgeschlagen ist. ( Siehe Dokumentation )

Wenn Sie möchten, dass Ihre Handler an einem bestimmten Punkt ausgelöst werden (Sie haben beispielsweise Ihr System für die Verwendung eines internen DNS konfiguriert und möchten jetzt einen Host über diesen DNS auflösen), können Sie alle Handler löschen, indem Sie eine Aufgabe wie die folgende definieren:

- meta: flush_handlers

Ein Handler würde nur einmal angerufen, egal wie oft er benachrichtigt wurde. Stellen Sie sich vor, Sie haben einen Dienst, der von mehreren Konfigurationsdateien abhängt (z. B. bind/named: rev, zone, root.db, rndc.key, named.conf) und Sie möchten named neu starten, wenn sich eine dieser Dateien ändert. Mit Handlern würden Sie einfach von jeder einzelnen Aufgabe benachrichtigen, die diese Dateien verwaltet. Andernfalls müssen Sie 5 unnötige VARs registrieren und diese anschließend in Ihrer Neustartaufgabe überprüfen.

Persönlich bevorzuge ich Handler. Es scheint viel sauberer zu sein als mit register umzugehen. Pro Register ausgelöste Aufgaben waren vor Ansible 1.9.1 sicherer.

67
udondan

Auf der Seite Ansible Variables können Sie sehen, wie register funktioniert.

Eine weitere wichtige Verwendung von Variablen besteht darin, einen Befehl auszuführen und das Ergebnis dieses Befehls zum Speichern des Ergebnisses in einer Variablen zu verwenden.

Registrierte Variablen sind wie Fakten:

Effektiv registrierte Variablen sind wie Fakten.

Dies unterscheidet sich stark von notify, das Handler auslöst. Es werden keine Variablen oder Fakten gespeichert.

4
Felipe Alvarez

mit ignore_errors: True Sie können verhindern, dass der ausgefallene Handler andere nach seiner weiteren Ausführung definierte Handler stoppt

1
Bruce Zu