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

问题描述 投票:0回答:3

我正在使用

template
模块创建一个 systemd 服务

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

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

ansible ansible-template
3个回答
45
投票

有两种解决方案。

注册+变更时

您可以注册

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
添加到所有任务中即可。

  • 如果其中任何任务的状态发生更改,则处理程序将运行。使用第一个解决方案,您将必须注册多个退货。并且会生成更长的
    when
    Clause_1
    or
    Clause_2
    or
  • 即使通知多次,处理程序也只会运行一次。

7
投票

这需要一个处理程序

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

当发生变化时,处理程序将自动收到模块的通知。有关 handlers 的更多信息,请参阅文档。


2
投票

由于您使用的是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
© www.soinside.com 2019 - 2024. All rights reserved.