wake-up-neo.net

Prüfen Sie, ob ein Service mit Ansible vorhanden ist

Ich habe ein Ansible-Playbook, um eine Java-App als init.d-Daemon bereitzustellen.

Als Anfänger sowohl in Ansible als auch in Linux habe ich Schwierigkeiten, Aufgaben auf einem Host abhängig vom Status des Hosts bedingt auszuführen.

Ich habe nämlich einige Hosts, bei denen der Dienst bereits vorhanden ist und dort ausgeführt wird, wo ich ihn stoppen möchte, bevor er irgendetwas anderes tut. Und dann gibt es vielleicht neue Hosts, die den Dienst noch nicht haben. Ich kann also nicht einfach service: name={{service_name}} state=stopped verwenden, da dies auf neuen Hosts fehlschlagen wird.

Wie kann ich das erreichen? Folgendes habe ich bisher:

  - 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

Natürlich könnte ich auch nur prüfen, ob das Wrapper-Skript in /etc/init.d vorhanden ist. So endete ich mit:

  - 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

Siehe das service_facts Modul, neu in Ansible 2.5.

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

Es wäre schön, wenn das "Service" -Modul Fehler "nicht erkannten Service" behandeln könnte.

Dies ist mein Ansatz, der den Befehl service verwendet, anstatt nach einem Init-Skript zu suchen:

- 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"
  • Überprüfen Sie den Exit-Code von "Dienststatus" und akzeptieren Sie den Exit-Code 0, wenn die Ausgabe "nicht erkannter Service" enthält
  • wenn der Exit-Code 0 war, ist dieser Dienst installiert (gestoppt oder läuft).
6
Florian

Ich habe die Antwort von @ Florian so geändert, dass nur der Rückkehrcode des service-Befehls verwendet wird (dies funktionierte in 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

Meine paar Cent Der gleiche Ansatz wie oben, jedoch für Kubernetze

Überprüfe, ob der Kublete-Dienst läuft

- name: "Obtain state of kublet service"
  command: systemctl status kubelet.service
  register: kubelet_status
  failed_when: kubelet_status.rc > 3

Debug-Nachricht anzeigen, wenn der Kublet-Dienst nicht ausgeführt wird

- debug:
    msg: "{{ kubelet_status.stdout }}"
  when: "'running' not in kubelet_status.stdout"
0
Lukasz Dynowski

Ein anderer Ansatz für systemd ( von 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
0
sourcejedi