我如何创建一个 Ansible "pre-handler" 在任务之前 运行 但仅当任务需要 运行 时?
How do I create an Ansible "pre-handler" that runs before the task but only if the task needs to run?
如何在任务之前创建一个 "pre-handler" 的 Ansible 运行,但前提是任务需要 运行?也就是说,Ansible会先检查任务是否需要运行。如果是,它 运行 是预处理器,然后 运行 是任务。如果任务不需要运行,则预处理器永远不会运行.
我的用例是一个以只读方式挂载的根文件系统。我有一个要创建 .bashrc
的 Ansible 任务。当且仅当 .bashrc
需要更新时,我希望 Ansible 将文件系统重新挂载为读写。在每个 Ansible 之前和之后重新挂载文件系统 运行 是不切实际的,因为再次将其设为只读需要重新启动。
如果任务更改了某些内容,则处理程序会收到该任务的通知。所以“预处理器”是不可能的,因为任务需要运行看看它是否改变了什么。
但是,您可以在 check mode. If you want to do things in order, you'll need to force the run of handlers with the meta
module 中从任务 运行ning 通知处理程序。
像下面的例子这样的东西能解决你的问题吗?
- 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
请注意,在此特定情况下,您可以在没有处理程序的情况下获得完全相同的结果。下面是另一个示例,其中包含一个仅当检查报告更改时才会 运行 的块。它甚至比前面的示例更好,因为如果不需要,将完全跳过真正的复制任务。
- 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
注意:我上面示例中的 &bashrc_copy_params
和 *bashrc_copy_params
符号是 yaml 锚点。如果需要,请参阅 learn yaml in Y minutes 以获取解释。它们在 Ansible 中是允许的,但必须在同一个文件中声明和使用。
如何在任务之前创建一个 "pre-handler" 的 Ansible 运行,但前提是任务需要 运行?也就是说,Ansible会先检查任务是否需要运行。如果是,它 运行 是预处理器,然后 运行 是任务。如果任务不需要运行,则预处理器永远不会运行.
我的用例是一个以只读方式挂载的根文件系统。我有一个要创建 .bashrc
的 Ansible 任务。当且仅当 .bashrc
需要更新时,我希望 Ansible 将文件系统重新挂载为读写。在每个 Ansible 之前和之后重新挂载文件系统 运行 是不切实际的,因为再次将其设为只读需要重新启动。
如果任务更改了某些内容,则处理程序会收到该任务的通知。所以“预处理器”是不可能的,因为任务需要运行看看它是否改变了什么。
但是,您可以在 check mode. If you want to do things in order, you'll need to force the run of handlers with the meta
module 中从任务 运行ning 通知处理程序。
像下面的例子这样的东西能解决你的问题吗?
- 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
请注意,在此特定情况下,您可以在没有处理程序的情况下获得完全相同的结果。下面是另一个示例,其中包含一个仅当检查报告更改时才会 运行 的块。它甚至比前面的示例更好,因为如果不需要,将完全跳过真正的复制任务。
- 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
注意:我上面示例中的 &bashrc_copy_params
和 *bashrc_copy_params
符号是 yaml 锚点。如果需要,请参阅 learn yaml in Y minutes 以获取解释。它们在 Ansible 中是允许的,但必须在同一个文件中声明和使用。