2015-05-19 7 views
19

У меня есть загрузочная игра Ansible для развертывания Java-приложения в качестве демона init.d.Проверьте, существует ли служба с Ansible

Будучи новичком как в 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 

ответ

22

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

вы также можете использовать' ignore_errors', особенно с реестром, опр Это и есть. – tedder42

+1

Да, я уклонился от ignore_errors, потому что боялся ложных негативов из-за опечаток и тому подобного. Также я пытаюсь убедить свою команду инвестировать в автоматизацию нашего управления конфигурацией и не хочу, чтобы первое, что показывало их, выглядело как хак. :) – EagleBeak

+0

решение также работает на ubuntu, и, вероятно, должно работать на большинстве дистрибутивов linux. –

6

Было бы хорошо, если модуль «сервис» может обрабатывать ошибки «непризнанная службы».

Это мой подход, используя команду 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, установлено, что служба (остановлена ​​или работает)
Смежные вопросы