Le mode Debug sur Ansible: Un Déboguer durant l’exécution Part 1.4

Le mode Debug sur Ansible: Un Déboguer durant l’exécution Part 1.4

Introduction

Ansible est un outil puissant d’automatisation des tâches système et réseau. Il offre plusieurs fonctionnalités pour faciliter le débogage et la résolution des problèmes. Ce guide vous présente les techniques de Debug sur Ansible les plus courantes.

Configuration initiale

Activer le format de sortie debug:

Ajoutez la ligne suivante à votre fichier de configuration ansible.cfg pour obtenir un format de sortie plus lisible:

[default]
stdout_callback = debug

L’inconvénient de cette sortie est qu’il est beaucoup moins verbeux voir pas du tout verbeux cependant il reste beaucoup plus lisible que le par defaut

[default]
stdout_callback = default

Toujours pas satisfait ! Vous souhaitez plus d’information. Essayez ce mode :

[default]
stdout_callback = dense

Vous pouvez avoir des information sur le temps d’exécution en utilisant le paramètre

[default]
#Avoir des information sur le temps d'exécution, ajouter ce paramètre dans ansible.cfg callback_whitelist = profile_tasks, timer, mail ;

Dans cet exemple, les plugins de callback profile_tasks et timer sont activés.

  • profile_tasks : Affiche le temps d’exécution de chaque tâche.
  • timer : Affiche le temps total d’exécution du playbook.
  • mail : Envoie un mail à l’adresse root@localhost. Cependant, vous pouvez modifier cette adresse de plusieurs manières (Voir l’article callback Plugin)

Exécuter le playbook pas à pas:

Utilisez l’option --step avec ansible-playbook pour exécuter le playbook pas à pas et examiner chaque tâche en détail:

ansible-playbook playbook.yml --step

Ceci vous permet de voir le chargement de chaque tâche, l’exécution se fera un par un et les résultats pourront être verifier à chaque étape. Une fois lancée vous aurez cette demande :

Perform task: configure ssh (y/n/c):

Y : Execute la prochaine tâche, N: Skip/Saute la prochaine tâche, C: Execute tout le reste

Reprendre l’exécution à partir d’une tâche spécifique:

Pour reprendre l’exécution du playbook à partir d’une tâche spécifique, utilisez l’option --start-at-task avec le nom de la tâche:

ansible-playbook playbook.yml --start-at-task "Nom_de_la_tâche"

Ceci est utile pour les tâches longues ou complexes où vous souhaitez ignorer les étapes précédentes. Cette option nous fait comprendre l’importance des noms de tâche

Debug sur Ansible des variables

Afficher le contenu d’une variable:

Utilisez le module debug pour afficher le contenu d’une variable déjà déclarer dans la sortie du playbook:

- name: Débogage de la variable "toto" definit plus haut
  debug:
    var: toto

Afficher la valeur d’une variable avec un message:

Formatez un message avec la valeur d’une variable:

- name: Afficher la valeur de la variable "var"
  debug:
    msg: "La valeur de var est : {{ var }}"

Afficher les variables de l’hôte actuel:

Accédez aux variables de l’hôte actuel en utilisant hostvars:

- name: Afficher les variables de l'hôte actuel
  debug:
    var_host: hostvars[inventory_hostname]
    msg: "La valeur des variables de l'hôte actuel sont : {{ var_host }}"

Cas d’idempotence

Problème: Le playbook Ansible échoue lors de la création d’une base de données existante, même si l’objectif est simplement de s’assurer que la base de données existe et de continuer le playbook.

Solution: Pour contourner cet échec (d’idempotence) et garantir la poursuite du playbook sans recréer la base de données existante mais en garantissantun changement. Il est possible d’utiliser une combinaison de la commande register et de la condition changed_when dans Ansible.

  • Contourne l’échec de la création de base de données existante.
  • Permet au playbook de continuer sans s’arrêter.
  • Empêche la recréation inutile de la base de données.
- name: Créer la base de données si elle n'existe pas
  mysql_db:
    name: ma_base_de_donnees
    state: present
  register: result
  changed_when: result.out is defined and "Creating tables" in result.out

Explication du fonctionnement:

  • La tâche mysql_db tente de créer la base de données ma_base_de_donnees.
  • La commande register capture la sortie de cette tâche dans la variable result.
  • La condition changed_when examine la variable result.out pour deux points clés :
    • result.out is defined: Vérifie si la variable contient une sortie, indiquant que la tâche s’est exécutée.
    • "Creating tables" in result.out: Recherche la chaîne de caractères « Creating tables » dans la sortie. Cette chaîne est généralement présente dans les messages de réussite de la création d’une base de données MySQL.
  • Si les deux conditions de changed_when sont remplies, la tâche est marquée comme modifiée, même si la base de données existait déjà. Cela indique à Ansible que l’opération a été effectuée avec succès et permet au playbook de continuer sans s’arrêter sur une erreur.

Mode débogage avancé

Activer le mode débogage pour un playbook:

Ajoutez la directive debugger avec la valeur always au playbook pour activer le mode débogage complet:

- name: Configurer le serveur Web avec Nginx et TLS
  debugger: always
  hosts: web
  become: true
  gather_facts: false

Ceci vous permet d’interagir avec le playbook pas à pas comme décrit dans la section « Exécuter le playbook pas à pas », cependant celui-ci contient plus d’option.

Commandes en mode débogage:

En mode débogage, vous disposez des commandes suivantes:

  • u: Refaire la tâche avec des variables mises à jour (update)
  • r: Relancer la tâche (redo)
  • c: Continuer l’exécution (continue)
  • q: Quitter le mode débogage (quit)

Inspecter les informations de la tâche:

Utilisez la commande p pour inspecter les informations de la tâche en cours (p pour print) :

  • p task.args: Voir les arguments de la tâche actuelle
  • task.args['path']=/home/ansible: Redéfinir la valeur d’un argument pour le module file
  • task_vars['user']=ansible: Redéfinir une variable de tâche
  • p result._result: Afficher le résultat de la tâche
  • p vars: Afficher toutes les variables
  • p vars[key]: Afficher la valeur d’une variable spécifique

Les options de la commande « meta » dans Ansible

Contrôle du flux d’exécution:

  • meta: end_batch: Arrête l’exécution du batch en cours et passe à la tâche suivante.
  • meta: end_host: Arrête l’exécution des tâches pour l’hôte courant sans erreur.
  • meta: end_play: Arrête l’exécution du playbook sans erreur.

Gestion des données:

  • meta: refresh_inventory: Actualise l’inventaire Ansible avant de poursuivre l’exécution.
  • meta: clear_facts: Supprime toutes les données collectées sur les hôtes avant de poursuivre l’exécution.
  • meta: clear_host_errors: Supprime les erreurs enregistrées pour les hôtes avant de poursuivre l’exécution.

Autres options:

  • meta: fail: Provoque une erreur dans la tâche en cours.
  • meta: skip_to_next_task: Passe à la tâche suivante sans exécuter la tâche en cours.
  • meta: notify: Déclenche une notification définie dans le playbook.

Utilisation:

Ces options sont généralement utilisées dans des blocs « when » ou des tâches pour contrôler le flux d’exécution en fonction de conditions spécifiques. Elles permettent de gérer des scénarios complexes et d’éviter des erreurs en cas de problèmes.

Exemple:

- name: Déployer une application
  hosts: appservers
  become: true
  tasks:
    - name: Installer les dépendances
      apt:
        name: "{{ item }}"
        state: present
      loop: "{{ required_packages }}"
 
    - name: Déployer le code
      copy:
        src: /path/to/app/
        dest: /var/www/app/
 
    when: inventory_hostname != "webserver1"
 
    # Arrêter l'exécution sur webserver1 en cas d'erreur
    meta: end_host
  rescue:
    - name: Envoyer une notification d'échec
      notify: Deployment failed

Résumé de l’exemple Meta :

Dans cet exemple, l’option meta: end_host est utilisée pour arrêter l’exécution des tâches sur l’hôte « webserver1 » en cas d’erreur lors de l’installation des dépendances. Cela permet de continuer le déploiement sur les autres serveurs sans être bloqué par une seule machine défaillante. Les options de la commande « meta » offrent un contrôle granulaire sur le flux d’exécution et la gestion des données dans les playbooks Ansible. Elles permettent d’écrire des playbooks plus robustes et flexibles, adaptés à des scénarios complexes.

Débogage des connexions

Débogage des connexions SSH:

Utilisez l’option -v avec ssh pour afficher des informations détaillées sur la connexion:

ssh -v user@machine

Tester la connectivité réseau:

Utilisez ansible avec le module ping et l’option -vvv pour tester la connectivité réseau:

ansible web -m ping -vvv

Vérifier les ports ouverts:

Utilisez nc pour vérifier si un port est ouvert sur une machine:

nc <machine> <port>

Quelque exemple pratiques

Techniques avancées de débogage

En plus des méthodes de débogage de base décrites précédemment, Ansible offre des fonctionnalités plus avancées pour analyser les problèmes complexes.

1. Inspecter les résultats des modules:

  • Utilisez la variable ansible_module_results pour accéder aux résultats d’un module (renommé en result)

YAML

- name: Debug module results
  debug:
    var: result
  • Explorez la structure arborescente du dictionnaire pour obtenir des informations détaillées sur l’exécution du module.

2. Utiliser des assertions:

  • Le module assert permet de vérifier des conditions sinon de stopper l’exécution en cas d’échec:

YAML

- name: Assert that a file exists
  assert:
    that: path/to/file.txt is file
  • Les assertions sont utiles pour valider l’état du système avant d’exécuter des tâches critiques créant une couche de sécurité.

3. Déboguer les modèles Jinja2:

  • Activez le mode verbeux pour les modèles Jinja2:

YAML

- name: Debug Jinja2 template rendering
  debug:
    msg: "{{ template('mytemplate.j2', var1='value1', var2=var2) }}"
  • Inspectez la sortie pour identifier les erreurs de syntaxe ou les problèmes de rendu sur votre template de configuration.

4. Utiliser des filtres de Debug sur Ansible:

  • Ansible propose des filtres de débogage pour formater et analyser les données:

YAML

- name: Debug a list of variables
  debug:
    var: my_list | pprint
  • Les filtres permettent d’explorer des structures de données complexes et de les présenter de manière lisible.

5. Profiter des outils de développement:

  • Ansible Lint permet de vérifier la syntaxe des playbooks et des rôles:
ansible-lint playbook.yml

6. Consulter la documentation et les ressources:

  • De nombreux blogs, articles et forums communautaires fournissent des conseils et des solutions à des problèmes spécifiques.

Blocks pour la gestion des erreurs et des conditions
Les blocks permettent de regrouper des tâches et de définir des conditions d’exécution lors d’un echec:
• Block rescue: Exécuté si la tâche précédente a échoué.
• Block always: Exécuté dans tous les cas, que la tâche précédente ait réussi ou échoué.
Exemple:

- name: Installer et configurer Nginx
  hosts: webservers
  become: true
  tasks:
    - name: Installer Nginx
      apt:
        name: nginx
        state: present

    - name: Configurer Nginx
      template:
        src: nginx.conf.j2
        dest: /etc/nginx/nginx.conf

    rescue:
      - name: Envoyer une notification d'échec
        notify: Nginx installation failed

  handlers:
    - name: Redémarrer Nginx
      service:
        name: nginx
        state: restarted

7. Exécution séquentielle et parallèle

• Stratégie linéaire (défaut): Exécute les tâches séquentiellement sur chaque hôte.
• Stratégie libre (free): Exécute les tâches en parallèle sur tous les hôtes.

Exemple:

- name: Déployer une application web
  strategy: free
  hosts: appservers
  become: true
  tasks:
    - name: Arrêter le service d'application
      service:
        name: app
        state: stopped

    - name: Mettre à jour le code de l'application
      git:
        repo: https://github.com/my-app.git
        dest: /var/www/app
        version: master

    - name: Démarrer le service d'application
      service:
        name: app
        state: started

8. Contrôle du nombre d’exécutions simultanées


• serial: Exécuter une tâche à la fois sur tous les hôtes.
• serial: 2, 30%: Exécuter 2 machines puis par séries de 30% des machines sur les tâches.


Exemple:

- name: Installer des paquets sur les hôtes
  serial: 2
  hosts: all
  become: true
  tasks:
    - name: Installer un paquet
      apt:
        name: "{{ package }}"
        state: present

9. Arrêt du playbook en cas fort taux d’échec

• max_failed_percentage: Définir un pourcentage maximum d’échec avant de s’arrêter.

Exemple:

- name: Déployer une application web
  max_failed_percentage: 25
  hosts: appservers
  become: true
  tasks:

10. Run Once et Local Connect/Delegate dans Ansible


Run_Once:
La directive run_once permet d’exécuter une tâche une seule fois par hôte, même si le playbook est exécuté plusieurs fois (car il contient plusieurs machine). C’est utile pour des tâches qui ne doivent être exécutées qu’une seule fois, comme l’installation d’un logiciel ou la configuration initiale d’un serveur active.


Exemple:

- name: Installer Nginx
  apt:
    name: nginx
    state: present
  run_once: true

11. Local Connect et Delegate Local:

Local Connect:
• Exécute la tâche directement sur l’hôte contrôleur (la machine où Ansible est exécuté).
• Utilisé pour:
• Exécuter des commandes système sur l’hôte contrôleur.
• Accéder à des ressources locales sur l’hôte contrôleur.
• Gérer des tâches qui ne nécessitent pas d’accès aux hôtes distants.
Exemple:

- name: Envoyer un email de notification
  local_action:
    module: send_mail
    from: ansible@example.com
    to: admin@example.com
    subject: "Playbook terminé"
    body: "Le playbook {{ playbook_file }} s'est terminé avec succès."
  connection: local

12. Delegate Local:

• Exécute la tâche sur l’hôte contrôleur, mais en utilisant les privilèges et les modules disponibles sur l’hôte distant.
• Utilisé pour:
• Exécuter des tâches qui nécessitent des privilèges élevés sur l’hôte distant.
• Accéder à des modules spécifiques à l’hôte distant.
• Gérer des tâches complexes qui ne peuvent pas être facilement exécutées en mode local.


Exemple:

- name: Installer un logiciel avec des privilèges élevés
  delegate_to: localhost
  become: true
  become_user: root
  tasks:
    - name: Installer le logiciel
      apt:
        name: my-software
        state: present

Choisir entre Local Connect et Delegate Local:

En résumé:
• run_once: Exécute une tâche une seule fois par hôte.
• local_action: Exécute une tâche directement sur l’hôte contrôleur.
• delegate_to: Exécute une tâche sur l’hôte contrôleur, mais en utilisant les privilèges et les modules de l’hôte distant.
Le choix entre ces options dépend des besoins spécifiques de votre tâche et de votre environnement Ansible.

En conclusion n’oubliez pas:

  • Le Debug sur Ansible est un processus itératif.
  • Commencez par les techniques de base et explorez les méthodes plus avancées si nécessaire.
  • Documentez soigneusement les étapes de débogage pour faciliter la résolution future des problèmes.
  • N’hésitez pas à demander de l’aide à la communauté Ansible si vous rencontrez des difficultés.

En maîtrisant ces techniques de débogage avancées, vous serez en mesure d’identifier et de résoudre rapidement les problèmes liés à vos playbooks et rôles Ansible, garantissant ainsi le bon fonctionnement de vos automatisations. C’était le Debug sur Ansible.

Automation Experts

Rejoignez-nous pour une newsletter exclusive sur l'automatisation des experts informatique !

Obtenez les dernières tendances, astuces et outils pour optimiser vos processus, accélérer vos projets et libérer tout le potentiel de l'automatisation dans le monde de la technologie. Abonnez-vous dès maintenant pour rester à la pointe de l'innovation et transformer votre manière de travailler."

Comments

No comments yet. Why don’t you start the discussion?

    Alors tu en pense quoi de cette article ? Dis-moi tous..