我正在使用
template
模块创建一个 systemd 服务
---
- 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
更多信息可以在 Ansible Doc 中找到。
第一种情况,服务会直接重启。对于处理程序,重新启动将在比赛结束时发生。
另一个区别是,如果您有多个任务更改需要重新启动服务,您只需将
notify
添加到所有任务中即可。
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