Frage Immer Handler-Ausführung in Ansible auslösen


Ich verwende Ansible, um meinen Entwicklungsserver bereitzustellen.

Ich möchte, dass es immer einige Dienste für mich beginnt. Ich habe Handler für diesen Zweck, aber was ist der beste Weg, die Handlerausführung ohne Bedingung auszulösen, z.B. Mach es immer funktionieren?

Etwas wie das:

tasks:
    - name: Trigger handler
      run_handler: name=nginx-restart

26
2017-08-03 11:06


Ursprung


Wenn Sie möchten, dass eine Aufgabe immer ausgeführt wird, sollten Sie sie eher zu einer Aufgabe als zu einem Handler machen. - Jordan
@ Jordan - manchmal möchten Sie vielleicht einen Handler haben, der in den meisten Szenarios mit Ausnahme dieses bestimmten bedingt ausgelöst wird. - silverdr


Antworten:


Wenn Sie 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 gemeldet wird

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

2) benutze Debug zusammen mit geändert_wenn: einen Handler auslösen

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

Auch von Hinweis für Option 1 und Check-Modus: Sie möchten möglicherweise verwenden check_mode: no Bei Verwendung von Ansible Version 2.2 oder höher oder always_run: yes wenn Sie frühere Versionen verwenden, damit die Aufgabe im Prüfmodus nicht übersprungen wird. Von meinen manuellen Tests sieht es so aus, als ob die Handler im Prüfmodus bleiben, aber bitte sei vorsichtig, da sich dein Fall unterscheiden kann.


50
2017-08-14 20:00



Heutzutage können Sie `--force-handlers auch dann noch Handler ausführen, wenn eine Aufgabe fehlschlägt` - conny
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 geführt hat. serverfault.com/a/799282/173002. ty. - sonjz


Ansible bietet mehrere Optionen zum Erzwingen von Handlern:

1) Um immer alle Handler zu zwingen, laufe ansible-playbook playbook.yml --force-handlers, wie hier dokumentiert: 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 Metatask verwenden https://docs.ansible.com/playbooks_intro.html:

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

3) Es klingt jedoch so, als wollten Sie nur sicherstellen, dass ein Dienst ausgeführt oder neu gestartet wird, unabhängig vom Ergebnis einer anderen Aufgabe. Verwenden Sie in diesem Fall keinen Handler, sondern einen neuen Task, der Ansible aufruft service Modul: 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

14
2018-05-09 21:28



Das Problem mit (3) ist, dass man mehrere Aufgaben haben kann, die den Handler benachrichtigen, und ich möchte nicht, dass der Handler mehrere Male ausgeführt wird (der Dienst wird neu gestartet). - Jonathan Hartley
Mehrere Aufgaben können denselben Handler benachrichtigen, und der Handler wird nur einmal ausgeführt. Das ist der Sinn von Handlern. - Jeff Widman
Hey Jeff. In dieser Antwort werden keine Handler verwendet und alle Aktionen, die nur Aufgaben verwenden, angegeben. - Jonathan Hartley
Tut mir leid, leider verstehe ich den Anwendungsfall, den du lösen willst, immer noch nicht ... Vielleicht öffnest du eine neue Frage mit einem Beispiel dafür, was du erreichen willst? Wenn Sie einen Kommentar mit einem Link hinzufügen, werde ich versuchen, es zu beantworten. - Jeff Widman
Ich brauche keine neue Frage. Der OQ fragte: "Wie kann ich sicherstellen, dass ein Handler IMMER läuft", und diese Antwort, Teil 3, schlug "Benutze stattdessen Aufgaben" vor, und mein Kommentar weist darauf hin, "Ihre Aufgabe könnte dann unter Umständen mehrmals ausgeführt werden." - Jonathan Hartley


Das Neustarten eines Dienstes ist eine Sache. sicherzustellen, dass es läuft, ist ein anderes. Falls Sie es wollen ansible sichergehen nginx läuft, du machst das:

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

6
2017-08-03 20:50