Ansible处理程序仅在更改时运行:true

时间:2016-02-24 10:55:00

标签: ansible ansible-playbook

使用Ansible安装ntp, 我通知处理程序以启动ntpd服务:
任务:

---
# roles/common/tasks/ntp.yml
  - name: ntp | installing
    yum: name=ntp state=latest
    notify: start ntp

处理程序:

---
# roles/common/handlers/main.yml

- name: start ntp
  service: name=ntpd state=started

如果尚未安装服务,则安装并启动它 如果服务已经安装但未运行,则不会通知处理程序:
任务状态为changed: false
这意味着,如果它已经在操作系统中显示,我就无法启动它。

有没有什么好的做法可以帮助确保服务已经安装并且处于运行状态?

PS:我可以这样做:

---
# roles/common/tasks/ntp.yml
  - name: ntp | installing
    yum: name=ntp state=latest
    notify: start ntp
    changed: true

但我不确定这是不错的做法。

2 个答案:

答案 0 :(得分:8)

来自Intro to Playbooks guide

  

正如我们所提到的,模块被编写为“幂等”,并且可以在远程系统上进行更改时进行中继。 Playbooks认识到这一点并拥有一个可用于响应变化的基本事件系统。

     

这些“通知”操作在剧本中每个任务块结束时触发,即使被多个不同任务通知也只会触发一次。

处理程序仅在设计更改时运行。如果您更改配置,则通常需要重新启动服务,但如果没有任何更改,则不要这样做。

如果服务尚未运行,您需要的是启动服务。为此,您应该使用@udondan所描述的常规任务:

- name: ntp | installing
  yum:
    name: ntp
    state: latest

- name: ntp | starting
  service:
    name: ntpd
    state: started
    enabled: yes

Ansible在设计上是幂等的,所以第二个任务只有在ntp尚未运行时才会运行。 enabled行会将服务设置为在启动时启动。如果不是所希望的行为,请删除此行。

答案 1 :(得分:4)

为什么不添加服务任务呢?处理程序通常用于在配置更改后重新启动服务。为确保服务运行无关紧要,只需添加以下任务:

- name: Ensure ntp is running
  service:
    name: ntpd
    state: started