2015-05-19 22 views
19

Ho una cartella di gioco Ansible per la distribuzione di un'app Java come un demone init.d.Verificare se il servizio esiste con Ansible

Essendo un principiante sia in Ansible che in Linux, ho problemi a eseguire in modo condizionale le attività su un host in base allo stato dell'host.

Vale a dire che alcuni host hanno il servizio già presente e in esecuzione dove voglio fermarlo prima di fare qualsiasi altra cosa. E poi potrebbero esserci nuovi host, che non hanno ancora il servizio. Quindi non posso semplicemente usare service: name={{service_name}} state=stopped, perché questo non funzionerà sui nuovi host.

Come posso ottenere questo risultato? Ecco quello che ho finora:

- 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 

risposta

22

Naturalmente potrei anche solo controllare se lo script wrapper esiste in /etc/init.d. Quindi questo è quello che ho finito con:

- 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

si può anche usare' ignore_errors', in particolare con il registro, a det ect questo. – tedder42

+1

Sì, ho evitato ignore_errors, perché avevo paura dei falsi negativi dovuti a errori di battitura e simili. Inoltre sto cercando di convincere il mio team di investire nell'automazione della nostra gestione della configurazione e non voglio che la prima cosa mostri loro l'aspetto di una sorta di hack. :) La soluzione – EagleBeak

+0

funziona anche su Ubuntu e probabilmente dovrebbe funzionare sulla maggior parte delle distro di Linux. –

6

Sarebbe bello se il modulo "servizio" in grado di gestire gli errori di "servizio non riconosciuti".

Questo è il mio approccio, utilizzando il comando service invece di controllare per uno script di init:

- 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" 
  • verifica il codice di uscita di "stato di servizio" e accettare il codice di uscita 0 quando l'output contiene " servizio non riconosciuto"
  • se il codice di uscita è stata dello 0, viene installato che il servizio (fermo o in funzione)
Problemi correlati