Ansible角色和处理程序 - 无法让角色处理程序工作

krm*_*krm 16 ansible-playbook

我需要在Centos 6.5中设置Apache/mod_wsgi,所以我的主要YAML文件是这样的:

---
- hosts: dev
  tasks:
    - name: Updates yum installed packages
      yum: name=* state=latest


- hosts: dev
  roles:
    - { role: apache }
Run Code Online (Sandbox Code Playgroud)

这应该更新所有yum安装的包然后执行apache角色.

apache角色配置为安装Apache/mod_wsgi,将Apache设置为在引导时启动并重新启动它.以下是内容roles/apache/tasks/main.yml:

---
- name: Installs httpd and mod_wsgi
  yum: name={{ item }} state=latest
  with_items:
    - httpd
    - mod_wsgi
  notify:
    - enable httpd
    - restart httpd
Run Code Online (Sandbox Code Playgroud)

和处理程序roles/apache/handlers/main.yml:

---
- name: enable httpd
  service: name=httpd enabled=yes

- name: restart httpd
  service: name=httpd state=restarted
Run Code Online (Sandbox Code Playgroud)

由于在执行playbook时给出了以下输出,因此处理程序似乎无法运行:

PLAY [dev] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [dev.example.com]

TASK: [Updates yum installed packages] **************************************** 
ok: [dev.example.com]

PLAY [dev] ******************************************************************** 

GATHERING FACTS *************************************************************** 
ok: [dev.example.com]

TASK: [apache | Installs httpd and mod_wsgi] ********************************** 
ok: [dev.example.com] => (item=httpd,mod_wsgi)

PLAY RECAP ******************************************************************** 
dev.example.com            : ok=4    changed=0    unreachable=0    failed=0 
Run Code Online (Sandbox Code Playgroud)

当我vagrant ssh进入虚拟机时,sudo service httpd status节目httpd停止并sudo chkconfig --list显示它尚未启用init.

我刚刚开始使用Ansible,那么有什么东西可以让我失踪吗?

krm*_*krm 16

好吧,回答我自己的问题,我意识到我错过了一个微妙的观点:

http://docs.ansible.com/playbooks_intro.html#handlers-running-operations-on-change

具体地,仅当任务引入改变时才产生通知信号.因此,对于我的用例,我认为我将继续在独立任务中启用和启动Apache,而不是依赖于更改信号处理程序.

  • 感谢那!这是一个在阅读文档时容易遗漏的区别. (3认同)
  • 或者,使用处理程序,但将 `changed_when: true` 元素添加到 YUM 节中。这将使 Ansible 始终认为 YUM 已“更改”事物,然后始终通知处理程序触发,无论软件包是否已安装。 (2认同)