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

ant*_*tov 4 ansible ansible-playbook

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

---
# roles/common/tasks/ntp.yml
  - name: ntp | installing
    yum: name=ntp state=latest
    notify: start ntp
Run Code Online (Sandbox Code Playgroud)

处理器:

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

- name: start ntp
  service: name=ntpd state=started
Run Code Online (Sandbox Code Playgroud)

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

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

PS:我可以这样做:

---
# roles/common/tasks/ntp.yml
  - name: ntp | installing
    yum: name=ntp state=latest
    notify: start ntp
    changed: true
Run Code Online (Sandbox Code Playgroud)

但我不确定这是好的做法.

Mil*_*eek 8

简介到手册指南:

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

这些"通知"操作在游戏手册中的每个任务块结束时触发,即使由多个不同任务通知也只会触发一次.

处理程序仅在设计变更时运行.如果更改配置,则通常需要重新启动服务,但如果没有任何更改,则不希望如此.

你想要的是在服务尚未运行时启动它.要做到这一点,你应该使用@udondan描述的常规任务:

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

- name: ntp | starting
  service:
    name: ntpd
    state: started
    enabled: yes
Run Code Online (Sandbox Code Playgroud)

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


udo*_*dan 5

那你为什么不添加一个服务任务呢?处理程序通常用于在配置更改后重新启动服务。为了确保服务在任何情况下都在运行,只需添加这样的任务:

- name: Ensure ntp is running
  service:
    name: ntpd
    state: started
Run Code Online (Sandbox Code Playgroud)