web-dev-qa-db-ja.com

タスクファイル内の以前の他のタスクのいずれかが変更された場合にのみ実行されるAnsibleロールタスクを作成するにはどうすればよいですか?

そのタスクファイル内の前のタスクの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

...そして、アップデートがインストールされているか、設定ファイルのいずれかが変更されている場合にのみ、サービスを再起動したいと思います。

これどうやってするの?

13
rasebo

ここでのベストプラクティスは、 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 の回答も参照してください。

11
udondan