gpt4 book ai didi

ansible - 如何编写仅在任务文件中的任何其他先前任务已更改时才运行的Ansible角色任务?

转载 作者:行者123 更新时间:2023-12-04 00:59:58 25 4
gpt4 key购买 nike

我正在一个角色上,当且仅当该任务文件中的任何先前任务已更改时,我才希望在该任务文件的末尾运行一个任务。

例如,我有:

- 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的答案。

关于ansible - 如何编写仅在任务文件中的任何其他先前任务已更改时才运行的Ansible角色任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38144598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com