2017-01-15 3 views
0

Ich versuche, eine Datei zu erstellen, um anzuzeigen, dass eine Ausführung eines Skripts/BefehlKann ich denselben Ansible-Handler zweimal in einer Spielbuchausführung verwenden?

Ich weiß, geschehen wir hier/script Kommando vermeiden sollte, aber ich kann also nicht

erneute Ausführung Ich bin zu verhindern Erstellen einer Datei, um es zu bezeichnen wurde bereits ausgeführt

Dies funktioniert für die letztere Aufgabe, aber nicht die ehemalige!

Ich frage mich, wenn die gleiche Handler zweimal verwendet werden kann oder nicht

Aufgaben ..

- set_fact: donefile=nodesource_setup 

- name: Ensure node install script executed 
    shell: ~/tmp/nodesource_setup.sh >> ~/tmp/nodesource_setup.log 
    args: 
    creates: ~/tmp/{{ donefile }}.done # Cannot one line this 
    notify: Done 

- set_fact: donefile=ensure-npm-does-not-use-unicode 

- name: Ensure npm does not use unicode 
    command: npm config set unicode false 
    args: 
    creates: ~/tmp/{{ donefile }}.done 
    notify: Done 

Handler ..

- name: Done 
    copy: 
    content: "done" 
    dest: ~/tmp/{{ donefile }}.done 
    force: no 

Antwort

2

Ein Handler ist eine Aufgabe, die ausgeführt wird, einmal:

  • nach allen anderen Aufgaben laufen (default)
  • auf meta: flush_handlers Aufgabe hatte (die „notify“ zurückgesetzt wird und wenn ein Handler wieder gemeldet wird, wird es erneut ausgeführt werden)
  • mit Ihrem Code

Das Problem ist, dass bei Die Zeit der Ausführung des Done Handlers, Ihre donefile Variable wird den letzten Wert von donefile=ensure-npm-does-not-use-unicode haben.


Sie können die Aufgabe hinzufügen:

- meta: flush_handlers 

bevor Sie den Wert von donefile ändern, so dass für einen bestimmten Wert wird die Handler ausgeführt werden. Das einzige Problem ist, dass es nicht viel Sinn macht - es kann eine reguläre Aufgabe sein, kein Handler.

Der Sinn eines Handlers besteht darin, zu verhindern, dass er mehr als einmal ausgeführt wird, auch wenn mehrere Tasks dies erfordern.

Wenn Sie es einmal ausführen möchten, können Sie einfach mit einer regulären Aufgabe oder einer Aufgabe mit when Bedingung gehen.

+0

- meta: flush_handlers .. ist super thx, tat genau das, was ich wollte. großartige Einsichten. Ich bevorzuge Handler für triviale Benachrichtigungsaufgaben gegenüber normalen Aufgaben, weil es die Anzahl der Aufgaben reduziert, die ausgeführt werden, wenn die Behandler nicht ausgelöst werden. – danday74

+0

In diesem Fall wird der Handler jedoch zweimal aufgerufen. Das einzige, was Sie speichern, sind vier Zeilen in Ihrem Code, die jemanden in der Zukunft wirklich verwirren werden, der die Handler verwendet, die im "Feuer" verwendet werden nur einmal "Methode. Wenn du der einzige bist, der * dieses * Spielbuch jemals verwalten wird, dann ist das wahrscheinlich keine große Sache. Wenn es eine Chance gibt, dass Sie das an ein Operations-Team weitergeben (oder besser noch in den Ruhestand!), Würde ich vorschlagen, dass Sie bei den beiden Aufgaben bleiben und nicht die Handler-plus-Meta-Problemumgehung. –

Verwandte Themen