web-dev-qa-db-fra.com

Vérifier si le service existe avec Ansible

J'ai un livre de lecture Ansible pour le déploiement d'une application Java en tant que démon init.d.

En tant que débutant dans Ansible et Linux, je ne parviens pas à exécuter de manière conditionnelle des tâches sur un hôte en fonction de son statut.

À savoir que certains hôtes ayant le service déjà présent et en cours d'exécution, je veux l'arrêter avant de faire autre chose. Et puis, il pourrait y avoir de nouveaux hôtes, qui n'ont pas encore le service. Donc, je ne peux pas simplement utiliser service: name={{service_name}} state=stopped, car cela échouera sur les nouveaux hôtes.

Comment puis-je y parvenir? Voici ce que j'ai jusqu'à présent:

  - 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
27
EagleBeak

Bien sûr, je pourrais aussi simplement vérifier si le script d'encapsulation existe dans /etc/init.d. Donc voici ce que j'ai fini avec:

  - 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
29
EagleBeak

Voir le module service_facts , nouveau dans Ansible 2.5.

- name: Populate service facts
  service_facts:
- debug:
    msg: Docker installed!
  when: "'docker' in services"
9
Aidan Feldman

Ce serait bien si le module "service" pouvait gérer les erreurs "service non reconnu".

Voici mon approche, en utilisant la commande service au lieu de rechercher un script d'initialisation:

- 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"
  • vérifier le code de sortie de "statut du service" et accepter le code de sortie 0 lorsque la sortie contient "service non reconnu"
  • si le code de sortie était 0, ce service est installé (arrêté ou en cours d'exécution)
6
Florian

J'ai modifié la réponse de @ Florian pour n'utiliser que le code retour de la commande service (cela fonctionnait sous 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
4
darkwing

Mes quelques centimes. La même approche que ci-dessus mais pour les kubernetes

Vérifiez si le service kublete est en cours d'exécution

- name: "Obtain state of kublet service"
  command: systemctl status kubelet.service
  register: kubelet_status
  failed_when: kubelet_status.rc > 3

Affiche un message de débogage si le service kublet n'est pas en cours d'exécution

- debug:
    msg: "{{ kubelet_status.stdout }}"
  when: "'running' not in kubelet_status.stdout"
0
Lukasz Dynowski