Ansible: reinicie o serviço somente se ele estiver em execução

Ansible: reinicie o serviço somente se ele estiver em execução

Em um manual do Ansible, gostaria de reiniciar um serviço após atualizar o arquivo de configuração, mas somente se fossejá correndo.

Não quero controlar o estado do serviço com ansible, apenas reiniciá-lo se já tiver sido iniciado anteriormente.

Eu poderia usar um comando personalizado para isso, mas não seria portátil em diferentes sistemas de gerenciamento de serviços (upstart/systemd/sysvinit/openrc...) como é o módulo de serviço do ansible.

Obrigado por qualquer dica.

Responder1

Registre uma variável quando a configuração for atualizada. Registre outra variável ao verificar se um serviço está em execução. Chame o manipulador de reinicialização do serviço somente se ambas as variáveis ​​forem verdadeiras.

Quanto às especificidades de vários sistemas operacionais, você pode ter execução condicional com base na família/distribuição dos dados do host.

Responder2

O módulo do Ansible service:não fornece um mecanismo para verificar se um serviço já está em execução ou não. Portanto, você terá que recorrer a algo assim por meio do shell:módulo para determinar primeiro se o serviço está em execução.

Exemplo

Aqui estou detectando se o WebSphere ou o Tomcat8 estão em execução e, em seguida, reiniciando o serviço apropriado com base em seu status.

---
# 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 a reinicialização somente se um arquivo específico tiver sido atualizado, você pode usar um register:em suas tarefas copy:ou template:para salvar o estado de atualização do arquivo. Os resultados disso register:podem então ser incorporados como parte da when:tarefa service: name=XXXX state=restarted.

Responder3

Agora você pode usar o módulo integrado service_factspara verificar primeiro o estado do serviço. Depois, você pode adicionar uma condição com base no estado do serviço.

Aqui está o meu exemplo, que foi configurado para ser notificado por outras tarefas.


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

informação relacionada