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
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
Voir le module service_facts
, nouveau dans Ansible 2.5.
- name: Populate service facts
service_facts:
- debug:
msg: Docker installed!
when: "'docker' in services"
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"
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
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"