Проверьте, существует ли сервис с Ansible
У меня есть Ansible playbook для развертывания Java-приложения в качестве демона init.d.
Будучи новичком в Ansible и Linux, у меня возникли проблемы с условным выполнением задач на хосте на основе состояния хоста.
А именно, у меня есть несколько хостов, у которых уже есть и работает служба, где я хочу остановить ее, прежде чем делать что-либо еще. И тогда могут появиться новые хосты, у которых пока нет сервиса. Поэтому я не могу просто использовать service: name={{service_name}} state=stopped
, потому что это не удастся на новых хостах.
Как я могу это достичь? Вот что я до сих пор:
- name: Check if Service Exists
shell: "if chkconfig --list | grep -q my_service; then echo true; else echo false; fi;"
register: service_exists
# This should only execute on hosts where the service is present
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_exists
register: service_stopped
# This too
- name: Remove Old App Folder
command: rm -rf {{app_target_folder}}
when: service_exists
# This should be executed on all hosts, but only after the service has stopped, if it was present
- name: Unpack App Archive
unarchive: src=../target/{{app_tar_name}} dest=/opt
Ответы
Ответ 1
Конечно, я мог бы просто проверить, существует ли оболочка script в /etc/init.d. Итак, это то, с чем я закончил:
- name: Check if Service Exists
stat: path=/etc/init.d/{{service_name}}
register: service_status
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_status.stat.exists
register: service_stopped
Ответ 2
См. модуль service_facts
, новый в Ansible 2.5.
- name: Populate service facts
service_facts:
- debug:
msg: Docker installed!
when: "'docker' in services"
Ответ 3
Было бы неплохо, если бы модуль "service" мог обрабатывать ошибки "непризнанной службы".
Это мой подход, используя команду service
вместо проверки на init script:
- name: check for apache
shell: "service apache2 status"
register: _svc_apache
failed_when: >
_svc_apache.rc != 0 and ("unrecognized service" not in _svc_apache.stderr)
- name: disable apache
service: name=apache2 state=stopped enabled=no
when: "_svc_apache.rc == 0"
- проверить код выхода из "статуса службы" и принять код выхода 0, если вывод содержит "непризнанную услугу"
- если код выхода равен 0, эта служба установлена (остановлена или запущена).
Ответ 4
Я изменил Florian answer, чтобы использовать только код возврата команды service
(это работало на Mint 18.2)
- name: Check if Logstash service exist
shell: service logstash status
register: logstash_status
failed_when: not(logstash_status.rc == 3 or logstash_status.rc == 0)
- name: Check if Logstash service exist
service:
name: logstash
state: stopped
when: logstash_status.rc == 0
Ответ 5
Мои несколько центов. Тот же подход, что и выше, но для кубернетес
Проверьте, работает ли служба kublete
- name: "Obtain state of kublet service"
command: systemctl status kubelet.service
register: kubelet_status
failed_when: kubelet_status.rc > 3
Показать сообщение об отладке, если служба kublet не запущена
- debug:
msg: "{{ kubelet_status.stdout }}"
when: "'running' not in kubelet_status.stdout"
Ответ 6
Другой подход к systemd (от Jakuje):
- name: Check if cups-browsed service exists
command: systemctl cat cups-browsed
check_mode: no
register: cups_browsed_exists
changed_when: False
failed_when: cups_browsed_exists.rc not in [0, 1]
- name: Stop cups-browsed service
systemd:
name: cups-browsed
state: stopped
when: cups_browsed_exists.rc == 0