playbook hostvars group_vars centos ansible ansible-playbook

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"