centos - hostvars - ansible roles
Compruebe si el servicio existe con Ansible (4)
Tengo un libro de jugadas de Ansible para implementar una aplicación Java como un daemon init.d.
Al ser un principiante tanto en Ansible como en Linux, tengo problemas para ejecutar condicionalmente las tareas en un host según el estado del host.
Es decir, tengo algunos hosts que tienen el servicio ya presente y en funcionamiento, donde quiero detenerlo antes de hacer cualquier otra cosa. Y luego podría haber nuevos hosts, que aún no tienen el servicio. Entonces no puedo simplemente usar service: name={{service_name}} state=stopped
, porque esto fallará en nuevos hosts.
¿Cómo puedo lograr esto? Esto es lo que tengo hasta ahora:
- name: Check if Service Exists
shell: "if chkconfig --list | grep -q my_service; then echo true; else echo false; fi;"
register: service_exists
# This should only execute on hosts where the service is present
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_exists
register: service_stopped
# This too
- name: Remove Old App Folder
command: rm -rf {{app_target_folder}}
when: service_exists
# This should be executed on all hosts, but only after the service has stopped, if it was present
- name: Unpack App Archive
unarchive: src=../target/{{app_tar_name}} dest=/opt
Modifiqué la respuesta de @Florian para usar solo el código de retorno del comando de service
(esto funcionó en Mint 18.2)
- name: Check if Logstash service exist
shell: service logstash status
register: logstash_status
failed_when: not(logstash_status.rc == 3 or logstash_status.rc == 0)
- name: Check if Logstash service exist
service:
name: logstash
state: stopped
when: logstash_status.rc == 0
Por supuesto, también podría comprobar si el script de envoltorio existe en /etc/init.d. Así que esto es lo que terminé con:
- name: Check if Service Exists
stat: path=/etc/init.d/{{service_name}}
register: service_status
- name: Stop Service
service: name={{service_name}} state=stopped
when: service_status.stat.exists
register: service_stopped
Sería bueno si el módulo "servicio" pudiera manejar errores de "servicio no reconocido".
Este es mi enfoque, utilizando el comando de service
lugar de buscar un script de inicio:
- name: check for apache
shell: "service apache2 status"
register: _svc_apache
failed_when: >
_svc_apache.rc != 0 and ("unrecognized service" not in _svc_apache.stderr)
- name: disable apache
service: name=apache2 state=stopped enabled=no
when: "_svc_apache.rc == 0"
- verifique el código de salida de "estado del servicio" y acepte el código de salida 0 cuando la salida contenga "servicio no reconocido"
- si el código de salida era 0, ese servicio está instalado (detenido o en ejecución)
Ver el módulo service_facts
, nuevo en Ansible 2.5.
- name: Populate service facts
service_facts:
- debug:
msg: Docker installed!
when: "''docker'' in services"