bit*_*ant 5 ansible ansible-2.x
如何创建一个在任务之前运行但仅在任务需要运行时运行的 Ansible“预处理程序”?换句话说,Ansible 会首先检查任务是否需要运行。如果是,它将运行预处理程序,然后运行任务。如果不需要运行任务,则永远不会运行预处理程序。
我的用例是将根文件系统安装为只读。我有一个 Ansible 任务要创建.bashrc。.bashrc当且仅当需要更新时,我希望 Ansible 将文件系统重新挂载为读写。在每次 Ansible 运行之前和之后重新挂载文件系统是不切实际的,因为再次使其只读需要重新启动。
如果任务更改了某些内容,则处理程序会收到该任务的通知。因此,“预处理程序”是不可能的,因为任务需要运行来查看它是否改变了某些内容。
但是,您可以从在检查模式下运行的任务通知处理程序。如果您想按顺序执行操作,则需要使用metamodule强制运行处理程序。
像下面的例子这样的东西可以解决您的问题吗?
- name: Check if .bashrc has the correct content
copy: &bashrc_copy_params
src: bashrc_root
dest: /root/.bashrc
owner: root
group: root
mode: 0644
check_mode: true
notify: remount root fs rw
- meta: flush_handlers
- name: Really copy .bashrc
copy: *bashrc_copy_params
Run Code Online (Sandbox Code Playgroud)
请注意,在这种特定情况下,无需处理程序即可获得完全相同的结果。下面是另一个示例,其中的块仅在检查报告更改时运行。它甚至比前面的示例更好,因为如果不需要,将完全跳过真正的复制任务。
- name: Check if .bashrc has the correct content
copy: &bashrc_copy_params
src: bashrc_root
dest: /root/.bashrc
owner: root
group: root
mode: 0644
check_mode: true
register: bashrc_state
- when: bashrc_state.changed | bool
block:
- name: remount root fs rw
debug:
msg: for example only, replace with your own task
- name: Really copy .bashrc
copy: *bashrc_copy_params
Run Code Online (Sandbox Code Playgroud)
注意:上面示例中的&bashrc_copy_params和符号是 yaml 锚点。*bashrc_copy_params如果需要,请参阅在 Y 分钟内学习 yaml以获取解释。它们在 Ansible 中是允许的,但必须在同一文件中声明和使用。
| 归档时间: |
|
| 查看次数: |
2166 次 |
| 最近记录: |