Rhy*_*vil 3 ansible ansible-playbook
我有一个安装tomcat的playbook然后部署一些web应用程序.Web应用程序部署任务通知处理程序重新启动tomcat.但处理程序永远不会触发.我正在使用一个处理程序来管理tomcat服务,因为我从文档中了解到,即使多次调用,处理程序也应该只触发一次.我错过了一些明显的东西吗
这是剧本:
---
- hosts: all
become: true
become_user: root
roles:
- role: common
- role: nginx
- role: tomcat
- role: launchpad
- role: manager
- role: reporting
handlers:
- include: /tomcat/handlers/etitomcat_service_ctrl.yml
Run Code Online (Sandbox Code Playgroud)
这是部署Web应用程序的角色之一:
---
- name: Remove the current installation of LaunchPad
file: path={{etitomcat_path}}/webapps/{{launchpad_module}} state=absent
- name: Remove the current war file for {{launchpad_module}}
file: path={{etitomcat_path}}/webapps/{{launchpad_module}}.war state=absent
- name: Download the latest snapshot of LaunchPad and deploy it to {{etitomcat_path}}
get_url: url={{launchpad_source_url}} dest={{etitomcat_path}}/webapps/{{launchpad_module}}.war mode=0744 owner={{etitomcat_user}} group={{etitomcat_group}} force=yes
notify: "restart_eti_tomcat"
Run Code Online (Sandbox Code Playgroud)
这是处理程序:
- name: "Restart ETI Tomcat"
service: name=etitomcat state=restarted
become: true
become_user: root
listen: "restart_eti_tomcat"
- name: "Start ETI Tomcat"
service: name=etitomcat state=started
become: true
become_user: root
listen: "start_eti_tomcat"
- name: "Stop ETI Tomcat"
service: name=etitomcat state=stopped
become: true
become_user: root
listen: "stop_eti_tomcat"
Run Code Online (Sandbox Code Playgroud)
添加static: yes应该在使用时解决此问题Ansible >= 2.1.
handlers:
- include: /tomcat/handlers/etitomcat_service_ctrl.yml
static: yes
Run Code Online (Sandbox Code Playgroud)
看看这个Github问题,链接的google groups线程也可能包含有价值的信息.
编辑
正如@rhythmicdevil指出的那样,文档说明:
您无法通知在include中定义的处理程序.从Ansible 2.1开始,这确实有效,但是include必须是静态的.
这可能不是重点,但无论如何我都会添加这一点,因为问题标题相当广泛,这是我在谷歌搜索时发现的问题,下面是我遇到的特定问题的解决方案。
请注意,处理程序仅在相应任务中注册了更改时才会触发。即使您以最高的详细程度运行该剧,也不会有像这样的条目说明这一点。
RUNNING HANDLER [base : somehandler ] ***********************
Unchanged: Skipping
Run Code Online (Sandbox Code Playgroud)
当它们在更改后被触发时,将是在所有任务都已执行之后。
这真的让我很困惑,因为任务会通知你,无论他们是否真的做了某事,而处理程序却保持安静。
例如,如果您有一个任务A,您已经运行了几次,直到它按照您的预期工作。
然后连接处理程序B来重新启动服务,除非您擦除任务A正在执行的操作或更改它,否则什么都不会发生。
只要任务A没有注册任何更改,它就不会触发处理程序B。
无论如何,这是 ansible 2.2.1 的行为。