2015-05-19 16 views
19

Mam Asystenta pod ręką dla wdrażania aplikacji Java jako demona init.d.Sprawdź, czy usługa istnieje z Ansouse

Będąc początkującym zarówno w Ansible, jak i Linux mam problemy z warunkowym wykonywaniem zadań na hoście na podstawie statusu hosta.

Mianowicie mam kilka hostów, które mają już usługę i działają tam, gdzie chcę ją zatrzymać, zanim zrobię cokolwiek innego. A potem mogą istnieć nowe hosty, które nie mają jeszcze usługi. Więc nie mogę po prostu użyć service: name={{service_name}} state=stopped, ponieważ to nie powiedzie się na nowych hostach.

Jak mogę to osiągnąć? Oto, co mam do tej pory:

- 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 

Odpowiedz

22

Oczywiście mógłbym również sprawdzić, czy skrypt opakowania istnieje w /etc/init.d. Więc to, co skończyło się z:

- 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

można również użyć' ignore_errors', zwłaszcza z rejestru, w celu det ect to. – tedder42

+1

Tak, uciekłem od ignore_errors, ponieważ bałam się fałszywych negatywów z powodu literówek i innych. Próbuję też przekonać mój zespół do zainwestowania w automatyzację naszego zarządzania konfiguracją i nie chcę, aby pierwsza rzecz, która pokazuje im wyglądała jak jakiś hack. :) Rozwiązanie – EagleBeak

+0

działa również na Ubuntu i prawdopodobnie powinno działać na większości dystrybucji Linuksa. –

6

Byłoby miło, gdyby moduł „usługa” może obsłużyć błędy „nierozpoznany Service”.

To jest moje podejście, za pomocą komendy service zamiast sprawdzania na skrypcie:

- 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" 
  • sprawdzić kod wyjścia „Stan usługi” i zaakceptować kod wyjścia 0, gdy wyjście zawiera " nierozpoznany usługa”
  • jeśli kod wyjścia 0, że usługa jest zainstalowana (zatrzymany lub bieg)