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éesma_base_de_donnees
. - La commande
register
capture la sortie de cette tâche dans la variableresult
. - La condition
changed_when
examine la variableresult.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 actuelletask.args['path']=/home/ansible
: Redéfinir la valeur d’un argument pour le module filetask_vars['user']=ansible
: Redéfinir une variable de tâchep result._result
: Afficher le résultat de la tâchep vars
: Afficher toutes les variablesp 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:
- La documentation officielle d’Ansible est une source précieuse d’informations et de tutoriels:
- 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.