В сценарии 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'