首页 > 解决方案 > 使用 Ansible 时服务文件更改时重启服务

问题描述

我正在使用template模块创建一个 systemd 服务

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

sonarqube.service 的内容当然可以改变。在更改时,我想重新启动服务。我怎样才能做到这一点?

标签: ansibleansible-template

解决方案


有两种解决方案。

注册 + 更改时

您可以注册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

更多信息可以在 Ansible Doc中找到。

这2个有什么区别?

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

另一个区别是,如果您有几个需要重新启动服务的任务更改,您只需将notify它们添加到所有任务中。

  • 如果这些任务中的任何一个获得更改的状态,则处理程序将运行。对于第一个解决方案,您将必须注册多个退货。它会生成一个更长的whenclause_1clause_2 or...or
  • 即使多次通知,处理程序也只会运行一次。

推荐阅读