![Ansible: reinicie o serviço somente se ele estiver em execução](https://rvso.com/image/652678/Ansible%3A%20reinicie%20o%20servi%C3%A7o%20somente%20se%20ele%20estiver%20em%20execu%C3%A7%C3%A3o.png)
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_facts
para 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'