我如何创建一个 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 中是允许的,但必须在同一个文件中声明和使用。