Ansible:仅在服务正在运行时重新启动服务

Ansible:仅在服务正在运行时重新启动服务

在 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'

相关内容