そのタスクファイル内の前のタスクのanyが変更された場合にのみ、タスクファイルの最後で1つのタスクを実行するロールに取り組んでいます。
たとえば、私は持っています:
- 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
...そして、アップデートがインストールされているか、設定ファイルのいずれかが変更されている場合にのみ、サービスを再起動したいと思います。
これどうやってするの?
ここでのベストプラクティスは、 handlers を使用することです。
あなたの役割でファイルを作成しますhandlers/main.yml
内容:
- name: restart mypackage
service: name=mypackage state=restarted
次に、すべてのタスクからこのハンドラーに通知します。タスクが変更された状態(=黄色の出力)を報告した場合にのみ、ハンドラーに通知されます
- 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
ハンドラーはプレイの最後に実行されます。再起動されたmypackageサービスに依存する他のロールが関係している場合は、ロールの最後にあるすべてのハンドラーをフラッシュすることをお勧めします。
- meta: flush_handlers
さらに、 force_handlers 設定を確認してください。 mypackgeロールの後に処理された他のロールでエラーが発生した場合、ハンドラーはトリガーされません。セットする force_handlers=True
あなたのansible.cfg
エラーが発生した後も、ハンドラーを強制的に実行します。これは非常に重要なトピックです。次回プレイブックを実行するときにファイルが変更されないため、ハンドラーに通知されないため、サービスが再起動されないためです。
ハンドラーなしでこれを行うこともできますが、これは非常に醜いです。後で再起動タスクに適用された状態で状態を確認できるように、すべてのタスクの出力を登録する必要があります。
- 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 is changed or mypackage_2 is changed or mypackage_3 is changed
mypackage_1を使用することができました| Ansible 2.9まで変更されました
Ansible Handler notify vs register の回答も参照してください。