如何创建一个在任务之前运行但仅在任务需要运行时运行的 Ansible“预处理程序”?

bit*_*ant 5 ansible ansible-2.x

如何创建一个在任务之前运行但仅在任务需要运行时运行的 Ansible“预处理程序”?换句话说,Ansible 会首先检查任务是否需要运行。如果是,它将运行预处理程序,然后运行任务。如果不需要运行任务,则永远不会运行预处理程序。

我的用例是将根文件系统安装为只读。我有一个 Ansible 任务要创建.bashrc.bashrc当且仅当需要更新时,我希望 Ansible 将文件系统重新挂载为读写。在每次 Ansible 运行之前和之后重新挂载文件系统是不切实际的,因为再次使其只读需要重新启动。

Zei*_*tor 5

如果任务更改了某些内容,则处理程序会收到该任务的通知。因此,“预处理程序”是不可能的,因为任务需要运行来查看它是否改变了某些内容。

但是,您可以从在检查模式下运行的任务通知处理程序。如果您想按顺序执行操作,则需要使用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 中是允许的,但必须在同一文件中声明和使用。