为什么我的Ansible处理程序没有解雇?

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)

Hen*_*ica 7

添加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必须是静态的.


Ges*_*ias 5

这可能不是重点,但无论如何我都会添加这一点,因为问题标题相当广泛,这是我在谷歌搜索时发现的问题,下面是我遇到的特定问题的解决方案。

请注意,处理程序在相应任务中注册了更改时才会触发。即使您以最高的详细程度运行该剧,也不会有像这样的条目说明这一点。

RUNNING HANDLER [base : somehandler ] *********************** 
Unchanged:  Skipping
Run Code Online (Sandbox Code Playgroud)

当它们在更改后被触发时,将是在所有任务都已执行之后。

这真的让我很困惑,因为任务会通知你,无论他们是否真的做了某事,而处理程序却保持安静。

例如,如果您有一个任务A,您已经运行了几次,直到它按照您的预期工作。

然后连接处理程序B来重新启动服务,除非您擦除任务A正在执行的操作或更改它,否则什么都不会发生。

只要任务A没有注册任何更改,它就不会触发处理程序B

无论如何,这是 ansible 2.2.1 的行为。