想象一下以下剧本,它管理一个 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 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.