如何为多操作系统的Ansible Role配置同名Handlers?
Ansible跨平台Handler实现方案
在编写支持FreeBSD、Linux等多操作系统的Ansible Role时,Tasks可以通过按系统导入任务文件的方式实现跨平台逻辑,示例如下:
--- - import_tasks: freebsd.yml when: ansible_os_family == "FreeBSD" tags: - foo - import_tasks: debian.yml when: ansible_os_family == "Debian" tags: - foo
问题
能否为Handlers实现类似逻辑,让任务通过同名的notify指令调用不同操作系统对应的服务重启操作?比如在任务中统一编写:
--- - name: 生成配置文件 template: src: test.j2 dest: /tmp/test notify: restart service
针对FreeBSD需要执行的Handler逻辑:
- name: restart service service: name: service state: restarted
针对Linux(如Debian系)需要执行的Handler逻辑:
- name: restart service systemd: daemon_reload: true state: restarted enabled: true
解决方案
完全可以实现,只需参照Tasks的导入逻辑,在handlers/main.yml中按操作系统导入对应的Handler文件即可:
- 主Handler文件(handlers/main.yml)
--- - import_tasks: handlers/freebsd.yml when: ansible_os_family == "FreeBSD" - import_tasks: handlers/debian.yml when: ansible_os_family == "Debian"
- FreeBSD专属Handler(handlers/freebsd.yml)
--- - name: restart service service: name: service state: restarted
- Debian/Linux专属Handler(handlers/debian.yml)
--- - name: restart service systemd: daemon_reload: true state: restarted enabled: true
这样配置后,当任务触发notify: restart service时,Ansible会根据当前主机的操作系统,自动执行对应系统下定义的同名Handler操作,实现跨平台的服务重启逻辑。
内容的提问来源于stack exchange,提问作者nbari
相关产品推荐
相关产品推荐

