如何跳过多余的 Ansible 处理程序?

问题描述 投票:0回答:1

想象一下以下剧本,它管理一个 systemd 服务单元和一个“事物”服务的配置文件:

---
- hosts: all
  tasks:
  - copy:
      src: thing.service
      dest: /etc/systemd/system/thing.service
    notify: restart thing

  - copy:
      src: thing.conf
      dest: /etc/thing.conf
    notify: reload thing

  handlers:
  - name: restart thing
    systemd:
      name: thing
      state: restarted

  - name: reload thing
    systemd:
      name: thing
      state: reloaded # Unnecessary if the restart handler has triggered.

如果我修改 thing.service 文件和 thing.conf 文件,处理程序将触发重新启动和重新加载。

无需重新加载,因为服务已重新启动。

有什么方法可以通知 Ansible ,这样它就不会在重启后触发不必要的重新加载吗?

我不想注册变量并使用“when”子句检查处理程序中的变量。我问 Ansible 是否在其剧本和任务语法中容纳了这一点。

ansible ansible-handlers
1个回答
0
投票

首先,您应该知道处理程序按照处理程序部分中定义的顺序执行,而不是按照通知语句中列出的顺序执行。所以重新加载被列在最后,因为你想在重新启动时跳过它。

自 Ansible 2.14 起,您可以使用元任务影响任务的执行。在此用例中,

ansible.builtin.meta: end_host
是合适的。每当您通知
end host
时,您都会通知额外处理程序
restart thing

---
- hosts: all:localhost
  tasks:
  - name: copy config
    ansible.builtin.copy:
      src: thing.conf
      dest: /etc/systemd/system/thing.service
    notify: reload thing

  - name: copy service
    ansible.builtin.copy:
      src: thing.service
      dest: /etc/systemd/system/thing.service
    notify:
      - restart thing
      - end host

  - name: enable service
    ansible.builtin.systemd:
      name: thing
      enabled: true
      daemon_reload: true
    notify:
      - restart thing
      - end host

  handlers:
  - name: restart thing
    ansible.builtin.systemd:
      name: thing
      state: restarted

  - name: end host
    ansible.builtin.meta: end_host

  - name: reload thing
    ansible.builtin.systemd:
      name: thing
      state: reloaded # Not run if the restart handler has triggered.
© www.soinside.com 2019 - 2024. All rights reserved.