使用 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
我正在使用 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_1or
clause_2or
... - 即使多次通知,处理程序也只会运行一次。
这需要处理程序
---
- 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