在 Ansible 剧本中,我想在更新配置文件后重新启动服务,但前提是已经运行。
我不想用 ansible 控制服务的状态,只想重新启动它(如果它之前已经启动)。
我可以使用自定义命令来实现这一点,但它不能像 ansible 的服务模块那样在不同的服务管理系统(upstart/systemd/sysvinit/openrc...)之间移植。
感谢您的任何提示。
答案1
当配置更新时注册一个变量。当检查服务是否正在运行时注册另一个变量。仅当两个变量都为真时才调用服务重启处理程序。
至于各种操作系统的具体情况,您可以根据主机事实的系列/分布进行条件执行。
答案2
Ansibleservice:
模块不提供检查服务是否已在运行的机制。因此,您必须通过模块使用类似这样的方法shell:
先确定服务是否正在运行。
例子
这里我检测WebSphere或Tomcat8是否正在运行,然后根据其状态重新启动适当的服务。
---
# handles tomcat8
- name: is tomcat8 already running?
shell: service tomcat8 status warn=false
register: _svc_tomcat8
failed_when: _svc_tomcat8.rc != 0 and ("unrecognized service" not in _svc_tomcat8.stderr)
ignore_errors: true
- name: restart tomcat8 if running
service: name=tomcat8 state=restarted
when: "_svc_tomcat8.rc == 0"
# handles WAS
- name: is WebSphere already running?
shell: service Node01_was.init status warn=false
register: _svc_websphere
failed_when: _svc_websphere.rc != 0 and ("unrecognized service" not in _svc_websphere.stderr)
ignore_errors: true
- name: restart WebSphere if running
service: name=Node01_was.init state=restarted
when: "_svc_websphere.rc == 0"
# vim:ft=ansible:
如果要仅在特定文件已更新时调用重新启动,您可以register:
在copy:
或template:
任务上使用 来保存文件是否已更新的状态。然后可以将此结果register:
合并为任务的when:
一部分service: name=XXXX state=restarted
。
答案3
现在,您可以先使用内置service_facts
模块检查服务状态。然后,您可以根据服务状态添加条件。
这是我的示例,它被设置为通过其他任务进行通知。
- name: check service status
service_facts:
listen:
- restart sidekiq
- name: restart sidekiq
service:
name: sidekiq
state: restarted
become: yes
when: ansible_facts.services['sidekiq.service']['state'] == 'running'