Ab Ansible 2.2 gibt es eine geeignete Lösung für dieses Problem.
Handler können auch allgemeine Themen „anhören“, und Aufgaben können diese Themen wie folgt benachrichtigen:
handlers:
- name: restart memcached
service: name=memcached state=restarted
listen: "restart web services"
- name: restart apache
service: name=apache state=restarted
listen: "restart web services"
tasks:
- name: restart everything
command: echo "this task will restart the web services"
notify: "restart web services"
Diese Verwendung erleichtert das Auslösen mehrerer Handler erheblich. Außerdem werden Handler von ihren Namen entkoppelt, wodurch es einfacher wird, Handler zwischen Spielbüchern und Rollen zu teilen
Speziell für die Frage sollte dies funktionieren:
- name: Check if restarted
shell: check_is_started.sh
register: result
listen: Restart processes
- name: Restart conditionally step 2
service: name=service state=restarted
when: result
listen: Restart processes
und benachrichtigen Sie in der Aufgabe die Handler über "Prozesse neu starten".
http://docs.ansible.com/ansible/playbooks_intro.html#handlers-running-operations-on-change
Notify handlers are always run in the same order they are defined, not in the order listed in the notify-statement. This is also the case for handlers using listen.
Verketten Sie in Ihrer Handler-Datei die verschiedenen Schritte mit notify.
Dann beziehen Sie sich auf eine Aufgabe mit
notify: Restart conditionally
.Beachten Sie, dass Sie nur Handler unter dem aktuellen benachrichtigen können. So kann zum Beispiel
Restart conditionally step 2
nicht benachrichtigenRestart conditionally
.Quelle: #ansible bei irc.freenode.net. Ich bin mir nicht sicher, ob dies auch in Zukunft funktionieren wird, da dies in der offiziellen Dokumentation nicht erwähnt wird.
quelle
notify
Beschriftungen für diejenigen, die Sie möglicherweise nicht ausführen möchten, wenn ein vorheriger Handler ausfällt, ist eine gute Möglichkeit, dies zu "beheben", wenn Sie dies nicht möchten.Bearbeiten: Wenn Sie Ansible 2.2 oder höher haben, verwenden Sie die Antwort von mkadan. Die folgende Antwort funktioniert nicht mit neueren Versionen von Ansible. Beachten Sie auch, dass diese Antwort gemäß dem Kommentar von Enis Afgan aufgrund eines Fehlers nicht mit Ansible-Versionen zwischen 2.0.2 und 2.1.2 funktioniert.
Ab Ansible 2.0 können Sie eine Include-Aktion in Ihrem Handler verwenden, um mehrere Aufgaben auszuführen.
Legen Sie Ihre Aufgaben beispielsweise in einer separaten Datei ab
restart_tasks.yml
(wenn Sie Rollen verwenden, werden diese in das Unterverzeichnis "Aufgaben" und nicht in das Unterverzeichnis "Handler" verschoben):Ihr Handler wäre dann einfach:
Quelle: Issue-Thread auf Github: https://github.com/ansible/ansible/issues/14270
quelle
include
mitinclude_tasks
.