it-swarm.com.ru

Проверьте, существует ли сервис с 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
27
EagleBeak

Конечно, я мог бы также просто проверить, существует ли скрипт-обертки в /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
29
EagleBeak

Смотрите модуль service_facts , новый в Ansible 2.5.

- name: Populate service facts
  service_facts:
- debug:
    msg: Docker installed!
  when: "'docker' in services"
9
Aidan Feldman

Было бы хорошо, если бы модуль "service" мог обрабатывать ошибки "нераспознанной службы".

Это мой подход, использующий команду service вместо проверки сценария инициализации:

- 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, эта служба установлена ​​(остановлена ​​или работает)
6
Florian

Я изменил ответ @ Florian, чтобы использовать только код возврата команды 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
4
darkwing

Мои несколько центов. Тот же подход, что и выше, но для kubernetes

Проверьте, запущен ли сервис 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"
0
Lukasz Dynowski