Die beste Vorgehensweise ist hier zu verwenden.
In Ihrer Rolle erstellen Sie eine Datei handlers/main.yml
mit dem Inhalt:
- name: restart mypackage
service: name=mypackage state=restarted
Dann diese Prozedur von allen Aufgaben informieren. Der Handler wird nur mitgeteilt werden, wenn eine Aufgabe, einen veränderten Zustand (= gelb Ausgabe) berichtet
- name: install package
apt: name=mypackage state=latest
notify: restart mypackage
- name: modify a file
lineinfile: do stuff
notify: restart mypackage
- name: modify a second file
lineinfile: other stuff
notify: restart mypackage
Handlers wird am Ende Ihres Spiels ausgeführt werden. Wenn Sie andere Rollen beteiligt haben, die auf dem neu gestarteten mypackage Dienst abhängig sind, können Sie alle Handler am Ende der Rolle spülen:
- meta: flush_handlers
haben zusätzlich einen Blick auf die force_handlers Einstellung. Falls ein Fehler in einer anderen Rolle auftritt, die nach Ihrer mypackge-Rolle verarbeitet wurde, wird der Handler nicht ausgelöst. Setzen Sie force_handlers=True
in Ihrem ansible.cfg
, um Ihre Handler immer noch dazu zu zwingen, nach Fehlern ausgeführt zu werden. Dies ist ein sehr wichtiges Thema, denn wenn Sie das Playbook das nächste Mal ausführen, werden die Dateien nicht geändert und der Handler wird nicht benachrichtigt, weshalb Ihr Dienst nie neu gestartet wird.
Sie können dies auch ohne Handler tun, aber das ist sehr hässlich. Sie müssen die Ausgabe jeder einzelnen Task registrieren, damit Sie später den Status in der Bedingung überprüfen können, die für die Neustartaufgabe gilt.
- name: install package
apt: name=mypackage state=latest
register: mypackage_1
- name: modify a file
lineinfile: do stuff
register: mypackage_2
- name: modify a second file
lineinfile: other stuff
register: mypackage_3
- name: restart if anything changed
service: name=mypackage state=restarted
when: mypackage_1 | changed or mypackage_2 | changed or mypackage_3 | changed
Siehe auch die Antwort auf Ansible Handler notify vs register.
Ah, brilliant, ich habe nie gedacht, dass Handler nur ausgelöst werden, wenn eine Änderung registriert wird ** und ** dass sie alle am Ende des Spiels ausgelöst werden. Ich habe zunächst über eine Mischung aus Registrieren und Benachrichtigen nachgedacht, aber das behebt diese Komplikation. Vielen Dank! – rasebo