使用 Ansible 时服务文件更改时重新启动服务

Restart service when service file changes when using Ansible

我正在使用 template 模块创建系统服务

---
- name: Systemd service
  template:
    src: sonar.unit.j2
    dest: /etc/systemd/system/sonarqube.service
  when: "ansible_service_mgr == 'systemd'" 

sonarqube.service 的内容当然可以更改。在更改时我想重新启动服务。我该怎么做?

有两种解决方法。

注册 + 更改时

您可以注册 template 模块输出(及其状态更改),

register: service_conf

然后使用when子句。

when: service_conf.changed

例如:

---
- name: Systemd service
  template:
    src: sonar.unit.j2
    dest: /etc/systemd/system/sonarqube.service
  when: "ansible_service_mgr == 'systemd'" 
  register: service_conf

- name: restart service
  service:
    name: sonarqube
    state: restarted
  when: service_conf.changed

处理程序 + 通知

您将重启服务任务定义为处理程序。然后在你的 template 任务中你 notify 处理程序。

tasks:
  - name: Add Sonarqube to Systemd service
    template:
      src: sonar.unit.j2
      dest: /etc/systemd/system/sonarqube.service
    when: "ansible_service_mgr == 'systemd'"
    notify: Restart Sonarqube
  - …

handlers:
  - name: Restart Sonarqube
    service:
      name: sonarqube
      state: restarted

可以找到更多信息 in Ansible Doc

这两个之间的区别?

第一种情况,服务会直接重启。在处理程序的情况下,重新启动将在播放结束时发生。

另一个区别是,如果您有多个任务更改需要重新启动服务,您只需将 notify 添加到所有任务即可。

  • 处理程序将 运行 如果其中任何一个任务的状态发生变化。对于第一个解决方案,您将必须注册多个 return。而且会生成更长的 when clause_1 or clause_2 or ...
  • 即使多次通知,处理程序也只会运行一次。

这需要处理程序

---
 - name: Testplaybook
   hosts: all
   handlers:
     - name: restart_service
       service:
         name: <servicename>
         state: restarted
   tasks:
     - template:
         src: ...
         dest: ...
       notify:
         - restart_service

处理程序会在发生更改时自动收到模块的通知。有关 handlers.

的更多信息,请参阅文档

由于您使用的是 systemd,因此您还需要执行 daemon-reload,因为您更新了服务文件。

任务只是模板化服务文件并通知处理程序:

- name: Systemd service
  template:
    src: sonar.unit.j2
    dest: /etc/systemd/system/sonarqube.service
  when: "ansible_service_mgr == 'systemd'" 
  notify: restart sonarqube systemd

根据上面特定 when 子句的存在,我假设您可能希望在未使用 systemd 的情况下指定单独的处理程序。 systemd 案例的处理程序如下所示:

- name: restart sonarqube systemd
  systemd:
    name: sonarqube
    state: restarted
    daemon_reload: yes