Handlerausführung immer in Ansible auslösen

33

Ich verwende Ansible, um meinen Entwicklungsserver bereitzustellen.

Ich möchte, dass immer einige Dienste für mich gestartet werden. Ich habe Handler für diesen Zweck, aber was ist der beste Weg, um die Ausführung eines Handlers ohne Bedingung auszulösen, z. B. damit es immer funktioniert?

Etwas wie das:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart
Slava Fomin II
quelle
6
Wenn Sie möchten, dass eine Task immer ausgeführt wird, sollten Sie sie eher als Task als als Handler definieren.
Jordanien,
@Jordan - manchmal möchten Sie vielleicht einen Handler haben, der in den meisten Szenarien, mit Ausnahme dieses speziellen Szenarios, bedingt ausgelöst wird.
Silverdr

Antworten:

61

Wenn Sie unbedingt jedes Mal einen Handler auslösen müssen, haben Sie zwei Möglichkeiten:

1) Führe einen noop Shell Befehl aus, der immer als geändert meldet

-  name: trigger nginx-restart
   command: /bin/true
   notify: nginx-restart

2) Verwenden Sie debug zusammen mit changed_when:, um einen Handler auszulösen

-  debug: msg="trigger nginx-restart"
   notify: nginx-restart
   changed_when: true

Auch der Note für Option 1 und Prüfmodus: Sie können verwendet werden sollen , check_mode: nowenn ansible Version 2.2 oder höher oder mit always_run: yesbei Verwendung von früheren Versionen als das so , dass die Aufgabe in Prüfmodus nicht bekommen übersprungen. Aus meinen manuellen Tests geht hervor, dass sich die Handler weiterhin im Überprüfungsmodus befinden. Seien Sie jedoch vorsichtig, da sich Ihr Fall möglicherweise unterscheidet.

Jarv
quelle
7
Heutzutage kann man `--force-Handler laufen Handler selbst wenn eine Aufgabe fails`
conny
5
Ja, aber das wird alle Handler zwingen zu rennen
Jarv
Ich fand diesen Beitrag nützlich in Bezug auf den geänderten Status, der mich hierher führte. serverfault.com/a/799282/173002 . ty.
Sonjz
Vielen Dank, ich habe Option 2 und a changed_whenmit mehr Logik verwendet, um eine nicht-idempotente Aufgabe (die in einigen Fällen mehrmals aufgerufen werden kann) als Handler und nicht als Aufgabe zu implementieren.
Sammitch
17

Ansible bietet mehrere Optionen zum Erzwingen von Handlern:

1) Um immer alle Handler zu erzwingen, führen Sie ansible-playbook playbook.yml --force-handlersdie folgenden Schritte aus: https://github.com/ansible/ansible/issues/4777

2) Um Handler zu erzwingen, die an einem bestimmten Punkt innerhalb eines Playbooks benachrichtigt wurden, können Sie eine Meta-Task https://docs.ansible.com/playbooks_intro.html verwenden :

tasks: 
  - shell: some tasks go here
  - meta: flush_handlers
  - shell: some other tasks

3) Es hört sich jedoch so an, als ob Sie nur sicherstellen möchten, dass ein Dienst ausgeführt oder neu gestartet wird, unabhängig vom Ergebnis einer anderen Aufgabe. Verwenden Sie in diesem Fall keinen Handler, sondern eine neue Task, die das serviceModul von Ansible aufruft : http://docs.ansible.com/service_module.html

tasks: 
  - name: ensure ntp is running
    service: name=ntp state=started enabled=yes

  - name: always reload nginx
    service: name=nginx state=reloaded

  - name: always restart MySQL
    service: name=mysql state=restarted
Jeff Widman
quelle
1
Das Problem mit (3) ist, dass möglicherweise mehrere Tasks den Handler benachrichtigen, und ich möchte nicht, dass der Handler mehrmals ausgeführt wird (den Dienst neu startet).
Jonathan Hartley
Mehrere Tasks können denselben Handler benachrichtigen, und der Handler wird nur einmal ausgeführt. Das ist der springende Punkt bei Handlern.
Jeff Widman
Hey Jeff. In dieser Antwort geht es darum, keine Handler zu verwenden und alle Aktionen nur mithilfe von Tasks anzugeben.
Jonathan Hartley
Entschuldigung, leider verstehe ich den Anwendungsfall, für den Sie eine Lösung suchen, immer noch nicht ... Öffnen Sie möglicherweise eine neue Frage mit einem Beispiel dessen, was Sie erreichen möchten? Wenn Sie einen Kommentar mit einem Link hinzufügen, werde ich versuchen, ihn zu beantworten.
Jeff Widman
Ich brauche keine neue Frage. Der OQ fragte "Wie kann ich sicherstellen, dass ein Handler IMMER ausgeführt wird", und diese Antwort, Teil 3, schlug "Verwenden Sie stattdessen Aufgaben" vor. In meinem Kommentar heißt es: "Ihre Aufgabe wird unter bestimmten Umständen möglicherweise mehrmals ausgeführt."
Jonathan Hartley
6

Ein Neustart eines Dienstes ist eine Sache. sicherzustellen, dass es läuft, ist eine andere. Wenn Sie ansiblesicherstellen möchten , dass das Programm ausgeführt nginxwird, gehen Sie wie folgt vor:

tasks:
  - name: Ensure nginx is running
    service: name=nginx state=started
Antonis Christofides
quelle