![Ansible: Dienst nur neu starten, wenn er ausgeführt wurde](https://rvso.com/image/652678/Ansible%3A%20Dienst%20nur%20neu%20starten%2C%20wenn%20er%20ausgef%C3%BChrt%20wurde.png)
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=restarted
Aufgabe integriert werden.
Antwort3
Sie können jetzt das integrierte service_facts
Modul 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'