Ansible: Dienst nur neu starten, wenn er ausgeführt wurde

Ansible: Dienst nur neu starten, wenn er ausgeführt wurde

In einem Ansible-Playbook möchte ich einen Dienst nach dem Aktualisieren der Konfigurationsdatei neu starten, aber nur, wenn dies der Fall warläuft bereits.

Ich möchte den Status des Dienstes nicht mit Ansible steuern, sondern ihn nur neu starten, wenn er zuvor gestartet wurde.

Ich könnte dafür einen benutzerdefinierten Befehl verwenden, dieser wäre jedoch im Gegensatz zum Servicemodul von Ansible nicht zwischen verschiedenen Serviceverwaltungssystemen (upstart/systemd/sysvinit/openrc...) portierbar.

Danke für jeden Tipp.

Antwort1

Registrieren Sie eine Variable, wenn die Konfiguration aktualisiert wird. Registrieren Sie eine weitere Variable, wenn Sie prüfen, ob ein Dienst ausgeführt wird. Rufen Sie den Handler zum Neustart des Dienstes nur auf, wenn beide Variablen wahr sind.

Was die Besonderheiten verschiedener Betriebssysteme betrifft, ist eine bedingte Ausführung basierend auf den Fakten zur Familie/Verteilung des Hosts möglich.

Antwort2

Das Ansible- service:Modul bietet keinen Mechanismus zum Überprüfen, ob ein Dienst bereits ausgeführt wird oder nicht. Daher müssen Sie über das shell:Modul auf etwas Ähnliches zurückgreifen, um zunächst festzustellen, ob der Dienst ausgeführt wird.

Beispiel

Hier erkenne ich, ob WebSphere oder Tomcat8 ausgeführt werden, und starte dann den entsprechenden Dienst basierend auf seinem Status neu.

---
# handles tomcat8
- name: is tomcat8 already running?
  shell: service tomcat8 status warn=false
  register: _svc_tomcat8
  failed_when: _svc_tomcat8.rc != 0 and ("unrecognized service" not in _svc_tomcat8.stderr)
  ignore_errors: true

- name: restart tomcat8 if running
  service: name=tomcat8 state=restarted
  when: "_svc_tomcat8.rc == 0"

# handles WAS
- name: is WebSphere already running?
  shell: service Node01_was.init status warn=false
  register: _svc_websphere
  failed_when: _svc_websphere.rc != 0 and ("unrecognized service" not in _svc_websphere.stderr)
  ignore_errors: true

- name: restart WebSphere if running
  service: name=Node01_was.init state=restarted
  when: "_svc_websphere.rc == 0"

# vim:ft=ansible:

Um den Neustart nur dann auszulösen, wenn eine bestimmte Datei aktualisiert wurde, können Sie mithilfe einer Funktion register:in Ihren copy:oder template:Aufgaben den Status der Aktualisierung der Datei speichern. Die Ergebnisse register:können dann als Teil der Funktion when:in die service: name=XXXX state=restartedAufgabe integriert werden.

Antwort3

Sie können jetzt das integrierte service_factsModul verwenden, um zunächst den Servicestatus zu prüfen. Anschließend können Sie eine Bedingung basierend auf dem Servicestatus hinzufügen.

Hier ist mein Beispiel, das so eingerichtet wurde, dass es von anderen Aufgaben benachrichtigt wird.


- name: check service status
  service_facts:
  listen:
    - restart sidekiq

- name: restart sidekiq
  service:
    name: sidekiq
    state: restarted
  become: yes
  when: ansible_facts.services['sidekiq.service']['state'] == 'running'

verwandte Informationen