Ansible: reinicie el servicio solo si se estaba ejecutando

Ansible: reinicie el servicio solo si se estaba ejecutando

En un manual de Ansible, me gustaría reiniciar un servicio después de actualizar el archivo de configuración, pero solo si estabaya corriendo.

No quiero controlar el estado del servicio con ansible, solo reiniciarlo si ya se inició anteriormente.

Podría usar un comando personalizado para eso, pero no sería portátil a través de diferentes sistemas de administración de servicios (upstart/systemd/sysvinit/openrc...) como lo es el módulo de servicio de ansible.

Gracias por cualquier consejo.

Respuesta1

Registre una variable cuando se actualice la configuración. Registre otra variable cuando compruebe si un servicio se está ejecutando. Llame al controlador de reinicio del servicio solo si ambas variables son verdaderas.

En cuanto a los detalles de varios sistemas operativos, podría tener una ejecución condicional basada en la familia/distribución de los datos del host.

Respuesta2

El módulo de Ansible service:no proporciona un mecanismo para verificar si un servicio ya se está ejecutando o no. Por lo tanto, tendrás que recurrir a algo como esto a través del shell:módulo para determinar primero si el servicio se está ejecutando.

Ejemplo

Aquí detecto si WebSphere o Tomcat8 se están ejecutando y luego reinicio el servicio apropiado según su estado.

---
# 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:

Para invocar el reinicio solo si se actualizó un archivo específico, puede usar a register:en sus tareas copy:o template:para guardar el estado de si el archivo se actualizó. Los resultados de esto register:pueden luego incorporarse como parte de when:la service: name=XXXX state=restartedtarea.

Respuesta3

Ahora puede utilizar el módulo integrado service_factspara comprobar primero el estado del servicio. Luego puede agregar una condición basada en el estado del servicio.

Este es mi ejemplo, que fue configurado para ser notificado por otras tareas.


- 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'

información relacionada