ansible - 使用 Ansible 时服务文件更改时重启服务
问题描述
我正在使用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中找到。
这2个有什么区别?
第一种情况,服务会直接重启。在处理程序的情况下,重新启动将在播放结束时发生。
另一个区别是,如果您有几个需要重新启动服务的任务更改,您只需将notify
它们添加到所有任务中。
- 如果这些任务中的任何一个获得更改的状态,则处理程序将运行。对于第一个解决方案,您将必须注册多个退货。它会生成一个更长的
when
clause_1clause_2or
...or
- 即使多次通知,处理程序也只会运行一次。
推荐阅读
- react-native - React Native MapView:什么是latitudeDelta longitudeDelta
- r - 逐行加速data.frame的子集,避免循环(dplyr,R)
- javascript - 调整大小时从上到下移动 n 响应式导航栏
- mongodb - MongoDB。创建/写入日志文件
- php - SSL 打破了 Facebook 的点赞按钮
- botframework - Bot Framework 更改表单提示信息
- java - 实践中的约束布局看起来与 Android Studio 中的不同
- php - 使用 PDO 从两个表中获取数据
- python - Python/Flask-WTF - 如何随机化动态 RadioField 的选择?
- jquery - 单击 TH 子项时不对 Tablesorter 进行排序