如何编写一个 Ansible 角色任务,仅在任务文件中的任何先前其他任务发生更改时运行?

问题描述 投票:0回答: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

...我只想在安装更新或更改任何配置文件时重新启动服务。

我该怎么做?

ansible ansible-role
1个回答
32
投票
这里的最佳实践是使用

处理程序

以您的角色创建一个文件

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 通知与注册的答案。

© www.soinside.com 2019 - 2024. All rights reserved.