Ansible: перезапустить службу только если она была запущена

Ansible: перезапустить службу только если она была запущена

В сценарии Ansible я хотел бы перезапустить службу после обновления файла конфигурации, но только если это было сделаноуже работает.

Я не хочу контролировать состояние службы с помощью ansible, а только перезапускать ее, если она была запущена ранее.

Я мог бы использовать для этого специальную команду, но она не будет переносима между различными системами управления службами (upstart/systemd/sysvinit/openrc...), как модуль службы ansible.

Спасибо за любые советы.

решение1

Регистрируйте переменную при обновлении конфигурации. Регистрируйте другую переменную при проверке работы службы. Вызывайте обработчик перезапуска службы, только если обе переменные имеют значение true.

Что касается специфики различных ОС, то можно реализовать условное выполнение на основе фактов о семействе/распределении хоста.

решение2

Модуль Ansible service:не предоставляет механизм для проверки того, запущена ли уже служба или нет. Поэтому вам придется прибегнуть к использованию чего-то вроде этого через 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'

Связанный контент