Ansible: Starten Sie den Dienst nur neu, wenn er ausgeführt wurde

9

In einem Ansible-Playbook möchte ich einen Dienst nach dem Aktualisieren der Konfigurationsdatei neu starten, jedoch nur, wenn er bereits ausgeführt wurde .

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

Ich könnte dafür einen benutzerdefinierten Befehl verwenden, der jedoch nicht auf verschiedene Service-Management-Systeme (upstart / systemd / sysvinit / openrc ...) portierbar ist, wie es das Servicemodul von ansible ist.

Vielen Dank für alle Tipps.

Beli
quelle

Antworten:

5

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

In Bezug auf die Besonderheiten verschiedener Betriebssysteme kann eine bedingte Ausführung basierend auf der Familie / Verteilung anhand der Host-Fakten erfolgen.

Mxx
quelle
Ja, ich könnte dies mit einem Handler mit der Bedingung "Wann" tun, um den Dienst neu zu starten. Mein einziges Problem ist eine plattformunabhängige Methode, um festzustellen, ob ein Dienst bereits ausgeführt wird, ohne seinen Status zu ändern, wie beim Modul "Dienst".
Beli
Derzeit servicekann das Modul das nicht. Sie können dies erreichen, indem Sie überprüfen, ob der gewünschte Prozess mit shell/ commandAusführung von ps vorhanden ist, oder indem Sie prüfen, ob eine run / pid-Datei vorhanden ist.
Mxx
Vielen Dank, dass Sie die Möglichkeiten benannt haben. Ich werde dies als die richtige Antwort betrachten. Ich werde auch in das serviceModul schauen und vielleicht ein Update vorschlagen oder sogar einen Patch einreichen.
Beli
3

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 so etwas 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 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 aufzurufen, wenn eine bestimmte Datei aktualisiert wurde, können Sie a register:für Ihre copy:oder template:Aufgaben verwenden, um den Status zu speichern, ob die Datei aktualisiert wurde. Die Ergebnisse davon register:können dann als Teil when:der service: name=XXXX state=restartedAufgabe übernommen werden.

slm
quelle
wusste nicht, dass 'failed_when' existiert. Das ist nützlich.
stochastischer