2016-07-01 13 views
4

Ich arbeite an einer Rolle, wo ich eine Aufgabe am Ende der Aufgaben-Datei ausgeführt werden soll, wenn und nur wenn eine der vorherigen Aufgaben in dieser Task-Datei geändert haben.Wie wird eine Ansible-Rollentask geschrieben, die nur ausgeführt wird, wenn eine der vorherigen Tasks in der Task-Datei geändert wurde?

Zum Beispiel habe ich:

- name: install package 
    apt: name=mypackage state=latest 

- name: modify a file 
    lineinfile: do stuff 

- name: modify a second file 
    lineinfile: other stuff 

- name: restart if anything changed 
    service: name=mypackage state=restarted 

... und ich möchte nur den Dienst neu zu starten, wenn ein Update installiert wurde oder eine der Konfigurationsdateien verändert wurde.

Wie kann ich das tun?

Antwort

6

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.

+0

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