Gérer des services avec des handlers

AnsibleBeginner
Pratiquer maintenant

Introduction

Les handlers sont des tâches Ansible spéciales qui ne s'exécutent que lorsqu'elles sont notifiées par une tâche ayant entraîné un changement. Ils sont couramment utilisés pour recharger ou redémarrer des services.

Dans ce laboratoire, vous déploierez une unité systemd de démonstration sécurisée, notifierez les handlers lorsque le fichier d'unité est modifié, et vérifierez que le service est bien actif et activé.

Créer un projet d'automatisation de service

Dans cette étape, vous allez créer un projet pour l'automatisation de services. Ce laboratoire utilise un alias d'hôte local car le service représente un état réel du système sur la machine virtuelle RHEL 10.

cd /home/labex/project
mkdir -p rhce-ansible/{inventory,files,playbooks,reports}
cd rhce-ansible
cat > ansible.cfg <<'EOF'
[defaults]
inventory = ./inventory/hosts
host_key_checking = False
retry_files_enabled = False
EOF
cat > inventory/hosts <<'EOF'
[service_hosts]
host ansible_connection=local
EOF

Même avec une connexion locale, le playbook gérera l'état réel de systemd sur la machine virtuelle. C'est pourquoi ce laboratoire utilise un alias d'hôte unique et become: true plus tard, plutôt que de simuler plusieurs hôtes de service indépendants.

Créer un fichier d'unité systemd de démonstration

Dans cette étape, vous allez créer le fichier d'unité source qu'Ansible copiera dans /etc/systemd/system. Le service exécute /usr/bin/sleep infinity, ce qui le rend sûr et facile à vérifier. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible. Cela garantit la stabilité des commandes, même si LabEx exécute chaque étape séparément.

cd /home/labex/project/rhce-ansible
cat > files/rhce-handler-demo.service <<'EOF'
[Unit]
Description=RHCE handler demo service

[Service]
Type=simple
ExecStart=/usr/bin/sleep infinity
Restart=always
RestartSec=1

[Install]
WantedBy=multi-user.target
EOF

Cette unité est volontairement inoffensive : elle démarre un processus sleep de longue durée et le redémarre s'il s'arrête. La section [Install] permet à Ansible d'activer le service pour multi-user.target.

sed -n "1,12p" files/rhce-handler-demo.service

Vérifiez les lignes ExecStart et WantedBy avant de continuer. Si le fichier d'unité source est incorrect, Ansible déploiera fidèlement une définition de service erronée.

Écrire un playbook avec des handlers

Dans cette étape, vous allez rédiger un playbook qui copie le fichier d'unité et notifie les handlers. La tâche meta: flush_handlers exécute les handlers en attente avant la tâche de service, afin que systemd prenne en compte la nouvelle unité. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
cat > playbooks/manage-service.yml <<'EOF'
---
- name: Deploy and manage the demo service
  hosts: service_hosts
  become: true
  gather_facts: false
  tasks:
    - name: Install demo systemd unit
      ansible.builtin.copy:
        src: ../files/rhce-handler-demo.service
        dest: /etc/systemd/system/rhce-handler-demo.service
        mode: '0644'
      notify:
        - Reload systemd
        - Restart demo service

    - name: Run handlers before enabling the service
      ansible.builtin.meta: flush_handlers

    - name: Ensure demo service is active and enabled
      ansible.builtin.systemd:
        name: rhce-handler-demo.service
        state: started
        enabled: true

  handlers:
    - name: Reload systemd
      ansible.builtin.systemd:
        daemon_reload: true

    - name: Restart demo service
      ansible.builtin.systemd:
        name: rhce-handler-demo.service
        state: restarted
EOF

La tâche copy ne notifie les deux handlers que lorsque le fichier d'unité est modifié. meta: flush_handlers exécute tous les handlers en attente avant que la tâche systemd ne démarre et n'active le service, ce qui est crucial car systemd doit recharger les fichiers d'unité avant de reconnaître un nouveau service.

ansible-playbook playbooks/manage-service.yml --syntax-check

La vérification de syntaxe doit réussir avant que le playbook n'écrive dans /etc/systemd/system. Elle permet de détecter les erreurs d'indentation dans la liste des tâches et dans la section handlers sans modifier l'état du service.

Exécuter le playbook et vérifier le service

Dans cette étape, vous allez exécuter le playbook du service. La première exécution doit installer l'unité, recharger systemd, démarrer le service et l'activer au démarrage. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible
ansible-playbook playbooks/manage-service.yml | tee reports/service-first-run.txt

La première exécution doit copier le fichier d'unité, recharger systemd, redémarrer le service de démonstration via le handler, puis s'assurer que le service est activé. Enregistrer la sortie vous permet de vérifier si le chemin du handler a été exécuté.

systemctl is-active rhce-handler-demo.service
systemctl is-enabled rhce-handler-demo.service

is-active vérifie l'état d'exécution pour le démarrage actuel, tandis que is-enabled vérifie si le service est lié à une cible de démarrage. Les tâches de service RHCE nécessitent souvent les deux.

Modifier le fichier d'unité et déclencher à nouveau le handler

Dans cette étape, vous allez effectuer une modification contrôlée du fichier d'unité source. Lorsque la tâche de copie détectera le changement, elle notifiera à nouveau les handlers. Avant d'exécuter les commandes de cette étape, retournez dans le répertoire du projet Ansible.

cd /home/labex/project/rhce-ansible

Le module lineinfile peut également modifier des fichiers locaux via une commande ad hoc. Ici, il ne modifie qu'une seule ligne dans l'unité source.

ansible localhost -c local -m ansible.builtin.lineinfile -a 'path=files/rhce-handler-demo.service regexp=^RestartSec= line=RestartSec=3'

Cela modifie le fichier source, et non l'unité installée sous /etc/systemd/system. La prochaine exécution du playbook devrait détecter le changement de la source, copier l'unité mise à jour et notifier à nouveau les handlers.

ansible-playbook playbooks/manage-service.yml | tee reports/service-second-run.txt
grep -F RestartSec /etc/systemd/system/rhce-handler-demo.service

L'unité installée devrait maintenant afficher RestartSec=3. Le service doit rester actif et activé, car les handlers ont rechargé systemd et redémarré le service de démonstration après la modification du fichier.

Résumé

Vous avez déployé une unité systemd sécurisée, utilisé des handlers pour le rechargement de systemd et le redémarrage du service, vérifié l'état actif et activé du service, et déclenché le handler par une modification contrôlée du fichier d'unité.