2017-01-15 10 views
0
だから、私は再実行を防ぐために

私はスクリプト/コマンドの実行が同じAnsibleハンドラを1回のプレイブック実行で2回使用できますか?

を行われていることを示すために、ファイルを作成しようとしています私たちはスクリプト/コマンドを避ける必要があります知っているが、ここで私はできません

それを示すために、ファイルを作成することは、すでにこれは、後者のタスクではなく、元の作品

を実行されています!

同じハンドラが二度か

タスク..

- 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 

ハンドラを使用することができます場合、私は思ったんだけど

..

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

答えて

2

ハンドラが実行されるタスクであります一度:他のすべてのタスクの後

  • meta: flush_handlersタスクに(デフォルト)
  • 実行されていた

あなたのコードに問題がでていることである(フラグがリセットされ、ハンドラが再び通知された場合、それが再び実行される「通知します」) Doneハンドラの実行時に、donefile変数の最後の値はdonefile=ensure-npm-does-not-use-unicodeになります。指定された値のためのハンドラが実行されるようにあなたは、donefileの値を変更する前に

- meta: flush_handlers 


あなたは、タスクを追加することができます。唯一の問題はそれほど意味がないことです。ハンドラではなく通常のタスクになることがあります。

ハンドラの存在意義は、複数のタスクがそれを要求する可能性があっても、複数回実行されるのを防ぐためです。

あなたが一度それを実行したい場合は、あなただけのwhen条件で通常のタスクまたはタスクに行くことができます。

+0

- メタ..ある素晴らしいTHX flush_handlersは、私が望んでいたまさにでした。素晴らしい洞察私はハンドラが起動しないときに実行されるタスクの数を減らすので、通常のタスクよりも簡単な通知タスクのハンドラを好む。 – danday74

+0

しかし、この場合、ハンドラは2回呼び出されているので、保存している唯一のものは、あなたのプレイブックコードでは、実際に使用されているハンドルラーを将来的に混乱させる4行です一度だけ "の方法です。 このプレイブックを*常に*管理する唯一の人は、これは大きな問題ではないでしょう。もしあなたがこれを運用チームに渡す(またはもっと退職してもよい)チャンスがあれば、私はあなたがハンドラとメタの回避策ではなく2つのタスクに固執することをお勧めします。 –

関連する問題