Sommaire
- Introduction
- Installation
- Ansible - Concepts de base
- Commandes Ansible essentielles
- Playbooks
- Inventaire
- Variables et Facts
- Modules Ansible courants
- Roles
- Ansible Navigator
- Comparaison ansible vs ansible-navigator
- Bonnes pratiques
Introduction
Ansible est un outil d’automatisation open-source qui permet de gérer la configuration, le déploiement d’applications et l’orchestration d’infrastructures. Il utilise une approche déclarative via des fichiers YAML appelés playbooks.
Ansible Navigator est une interface en ligne de commande moderne pour Ansible qui fonctionne avec des execution environments (conteneurs). Il offre une expérience interactive et améliore la reproductibilité des exécutions.
Pourquoi Ansible ?
- Agentless : pas besoin d’installer d’agent sur les machines cibles
- Simple : syntaxe YAML lisible
- Idempotent : peut être exécuté plusieurs fois sans effets secondaires
- Extensible : bibliothèque riche de modules
Pourquoi Ansible Navigator ?
- Isolation : exécution dans des conteneurs
- Reproductibilité : environments standardisés
- Interface améliorée : mode interactif avec navigation
- Logs structurés : meilleure traçabilité
Installation
Installation d’Ansible (méthode classique)
Avec pip (recommandé pour avoir la dernière version) :
| |
Explication : Installe Ansible via le gestionnaire de paquets Python. C’est la méthode la plus flexible pour obtenir les versions récentes.
Avec apt (Debian/Ubuntu) :
| |
Explication : Installe Ansible depuis les dépôts officiels. La version peut être plus ancienne mais plus stable.
Avec yum/dnf (RHEL/CentOS/Fedora) :
| |
Vérification de l’installation :
| |
Installation d’Ansible Navigator
Prérequis : Docker ou Podman doit être installé sur le système.
Avec pip :
| |
Explication : Ansible Navigator nécessite un runtime de conteneurs pour fonctionner avec les execution environments.
Vérification :
| |
Configuration de base :
Créer un fichier ansible-navigator.yml à la racine de votre projet :
| |
Explication :
execution-environment.image: spécifie l’image de conteneur à utiliserpull-policy: missing: télécharge l’image seulement si elle n’existe pas localementmode: stdout: affiche la sortie directement (modeinteractivedisponible aussi)playbook-artifact.enable: sauvegarde les logs d’exécution
Ansible - Concepts de base
Architecture
| |
Control Node : machine où Ansible est installé et d’où les commandes sont exécutées.
Managed Nodes : serveurs cibles gérés par Ansible. Pas besoin d’agent installé.
Inventory : liste des managed nodes organisés en groupes.
Playbook : fichier YAML contenant les tâches à exécuter.
Module : unité de code exécutée sur les managed nodes (ex: apt, copy, service).
Task : appel d’un module avec ses paramètres.
Role : ensemble organisé de tasks, variables, et fichiers réutilisables.
Facts : informations système collectées automatiquement sur les managed nodes.
Commandes Ansible essentielles
ansible (commandes ad-hoc)
Ping tous les hosts :
| |
Explication : Vérifie la connectivité avec tous les serveurs de l’inventaire. Le module ping teste la connexion SSH et la présence de Python.
Exécuter une commande sur tous les serveurs :
| |
Explication : Le flag -a permet d’exécuter une commande shell directement. Par défaut, utilise le module command.
Exécuter sur un groupe spécifique :
| |
Explication :
webservers: groupe de l’inventaire-m apt: utilise le module apt-a: arguments du module--become: exécute avec privilèges sudo
Copier un fichier :
| |
Explication : Utilise le module copy pour transférer un fichier vers les serveurs distants avec les permissions spécifiées.
Redémarrer un service :
| |
Explication : Gère les services systemd/init avec le module service. Les états possibles : started, stopped, restarted, reloaded.
Collecter les facts d’un serveur :
| |
Explication : Le module setup collecte toutes les informations système (OS, IP, CPU, mémoire, etc.).
Filtrer les facts :
| |
Explication : Le filtre permet de cibler des facts spécifiques, ici ceux concernant la distribution Linux.
ansible-playbook
Exécuter un playbook :
| |
Explication : Lance l’exécution du playbook sur les hosts définis dans le fichier.
Avec un inventaire spécifique :
| |
Explication : Le flag -i spécifie le fichier d’inventaire à utiliser au lieu du défaut (/etc/ansible/hosts).
Mode check (dry-run) :
| |
Explication : Simule l’exécution sans effectuer de changements réels. Utile pour tester avant déploiement.
Mode diff :
| |
Explication : Affiche les différences qui seraient appliquées sur les fichiers modifiés.
Verbose (debug) :
| |
Explication : Augmente la verbosité des logs. -v basique, -vvv très détaillé (debug), -vvvv debug connexion.
Avec des variables en ligne :
| |
Explication : Le flag -e (ou --extra-vars) permet de passer des variables qui surchargent toutes les autres sources.
Limiter à certains hosts :
| |
Explication : Restreint l’exécution à un host ou un groupe spécifique, même si le playbook en cible plus.
Démarrer à une tâche spécifique :
| |
Explication : Utile pour reprendre un playbook après un échec à une tâche particulière.
Avec des tags :
| |
Explication : Permet d’exécuter ou d’ignorer seulement les tâches marquées avec certains tags.
ansible-galaxy
Installer un role depuis Galaxy :
| |
Explication : Télécharge un role depuis Ansible Galaxy (dépôt public de roles) dans le répertoire par défaut.
Installer depuis un fichier requirements :
| |
Explication : Installe tous les roles listés dans le fichier YAML requirements.
Lister les roles installés :
| |
Créer un nouveau role :
| |
Explication : Génère la structure de dossiers standard d’un role Ansible.
ansible-vault
Créer un fichier chiffré :
| |
Explication : Ouvre un éditeur pour créer un fichier chiffré. Demande un mot de passe pour le chiffrement.
Éditer un fichier chiffré :
| |
Explication : Déchiffre temporairement pour édition, puis re-chiffre automatiquement.
Chiffrer un fichier existant :
| |
Déchiffrer un fichier :
| |
Explication : Attention, le fichier reste déchiffré sur le disque après cette commande.
Changer le mot de passe :
| |
Utiliser un fichier de mot de passe :
| |
Explication : Lit le mot de passe depuis un fichier au lieu de le demander interactivement.
Playbooks
Structure de base d’un playbook
| |
Explication détaillée :
---: marqueur de début de document YAMLname: description lisible du playhosts: groupe ou host cible de l’inventairebecome: yes: exécute les tâches avec sudovars: variables locales au playtasks: liste des tâches à exécuter séquentiellementhandlers: tâches spéciales exécutées seulement si notifiées (ex: redémarrage après modification de config)
Conditions et boucles
Condition simple :
| |
Explication : La tâche s’exécute seulement si la condition when est vraie. Utilise les facts Ansible.
Boucle simple :
| |
Explication : loop itère sur la liste. La variable {{ item }} représente l’élément courant.
Boucle avec dictionnaires :
| |
Explication : On peut itérer sur des objets complexes et accéder à leurs propriétés avec la notation point.
Conditions multiples :
| |
Explication : Toutes les conditions doivent être vraies (AND logique). Pour un OR, utiliser or dans l’expression.
Blocks et gestion d’erreurs
| |
Explication :
block: groupe de tâchesrescue: exécuté si une tâche du block échouealways: exécuté dans tous les cas (équivalent de finally)
Import vs Include
Import (statique, au parsing) :
| |
Explication : Le fichier est inclus lors du parsing. Les conditions et tags s’appliquent à toutes les tâches importées.
Include (dynamique, à l’exécution) :
| |
Explication : Le fichier est inclus dynamiquement. Permet des noms de fichiers basés sur des variables.
Inventaire
Inventaire INI
Fichier inventory.ini :
| |
Explication :
[groupname]: définit un groupe- Variables d’hôte : paramètres spécifiques après le hostname
[group:children]: groupe de groupes[group:vars]: variables appliquées à tout le groupeansible_host: surcharge l’IP/hostname de connexionansible_port: port SSH personnaliséansible_user: utilisateur pour la connexion SSH
Inventaire YAML
Fichier inventory.yml :
| |
Explication : Structure YAML équivalente au format INI. Plus flexible pour des structures complexes.
Inventaire dynamique
Script Python simple :
| |
Utilisation :
| |
Explication : Un inventaire dynamique est un script exécutable qui retourne du JSON. Utile pour interroger des APIs (AWS, Azure, etc.).
Patterns d’inventaire
| |
Cible le groupe webservers
| |
Cible tous les hosts commençant par “web”
| |
Union (webservers OU databases)
| |
Exclusion (webservers SAUF web01)
| |
Intersection (webservers ET production)
Variables et Facts
Sources de variables (par ordre de priorité)
- Extra vars (
-een ligne de commande) - Task vars (dans la tâche)
- Block vars (dans un block)
- Role et include vars
- Play vars_files
- Play vars_prompt
- Play vars
- Host facts
- Playbook host_vars
- Playbook group_vars
- Inventory host_vars
- Inventory group_vars
- Inventory vars
- Role defaults
Définir des variables
Dans un playbook :
| |
Dans vars_files :
| |
Dans group_vars :
Créer group_vars/webservers.yml :
| |
Explication : Ansible charge automatiquement group_vars/groupname.yml et host_vars/hostname.yml.
Variables enregistrées :
| |
Explication : register sauvegarde le résultat complet de la tâche dans une variable pour utilisation ultérieure.
Facts Ansible
Facts utiles :
ansible_hostname: nom d’hôteansible_fqdn: nom de domaine completansible_default_ipv4.address: IP principaleansible_distribution: distribution Linux (Ubuntu, CentOS, etc.)ansible_distribution_version: version de la distributionansible_os_family: famille d’OS (Debian, RedHat, etc.)ansible_processor_cores: nombre de cœurs CPUansible_memtotal_mb: RAM totale en MBansible_mounts: points de montage
Désactiver la collecte des facts :
| |
Explication : Accélère l’exécution si les facts ne sont pas nécessaires.
Créer des facts personnalisés :
Sur le managed node, créer /etc/ansible/facts.d/custom.fact :
| |
Utilisation :
| |
Explication : Les facts locaux sont accessibles via ansible_local.<filename>.<section>.<key>.
Modules Ansible courants
Gestion de paquets
apt (Debian/Ubuntu) :
| |
Explication :
state: present: assure que le paquet est installéupdate_cache: équivaut àapt-get updatecache_valid_time: ne met à jour le cache que s’il a plus de X secondes
yum/dnf (RHEL/CentOS) :
| |
package (module générique) :
| |
Explication : Détecte automatiquement le gestionnaire de paquets (apt, yum, etc.).
Gestion de fichiers
copy (copier des fichiers) :
| |
Explication :
src: fichier source sur le control nodedest: destination sur le managed nodebackup: yes: crée une copie avant écrasement
template (Jinja2) :
| |
Fichier template nginx.conf.j2 :
| |
Explication :
- Syntaxe Jinja2 avec
{{ variable }}et{% contrôle %} validate: commande de validation avant remplacement du fichier
file (gestion de fichiers/dossiers) :
| |
lineinfile (modifier une ligne) :
| |
Explication : Modifie ou ajoute une ligne dans un fichier. Utilise regex pour trouver la ligne.
blockinfile (insérer un bloc) :
| |
Gestion de services
service / systemd :
| |
Explication :
state: started: démarre le serviceenabled: yes: active au démarrage du système- États possibles : started, stopped, restarted, reloaded
Exécution de commandes
command :
| |
Explication :
- N’interprète pas les variables shell ($HOME, etc.)
creates: skip si le fichier existe déjà (idempotence)
shell :
| |
Explication : Utilise un shell complet (/bin/sh). Permet pipes, redirections, variables d’environnement.
script :
| |
Gestion d’utilisateurs
user :
| |
Explication :
append: yes: ajoute aux groupes sans supprimer les autres- Mot de passe doit être hashé (filtre
password_hash)
authorized_key :
| |
Modules réseau et cloud
get_url :
| |
uri (API REST) :
| |
docker_container :
| |
Roles
Structure d’un role
| |
Exemple de role complet
tasks/main.yml :
| |
defaults/main.yml :
| |
handlers/main.yml :
| |
meta/main.yml :
| |
Utiliser un role
Dans un playbook :
| |
Avec variables :
| |
Avec include_role (dynamique) :
| |
Ansible Navigator
Concepts clés
Execution Environment (EE) : conteneur contenant Ansible, Python, et toutes les dépendances nécessaires. Garantit la reproductibilité.
Artifact : fichier JSON généré après chaque exécution contenant tous les détails (logs, variables, tâches, etc.).
Mode interactif : interface TUI (Text User Interface) permettant de naviguer dans l’exécution d’un playbook.
Mode stdout : sortie classique comme ansible-playbook, mais avec les avantages des EE.
Configuration ansible-navigator.yml
Configuration complète :
| |
Explication détaillée :
container-engine: docker ou podmanvolume-mounts: montage de volumes dans le conteneuroptions: Z: pour SELinux (nécessaire sur RHEL/Fedora)pull-policy: always, missing, never, tagmode: interactive ou stdoutplaybook-artifact.save-as: pattern de nommage des artifacts{ts_utc}: timestamp UTC,{playbook_name}: nom du playbook
Commandes Ansible Navigator
Exécuter un playbook (mode stdout) :
| |
Explication : Lance le playbook dans un execution environment. Équivalent moderne de ansible-playbook.
Mode interactif :
| |
Explication : Ouvre l’interface TUI pour naviguer dans l’exécution. Permet d’explorer tâche par tâche.
Avec inventaire spécifique :
| |
Passer des variables :
| |
Utiliser une image EE personnalisée :
| |
Explication : --eei (execution environment image) surcharge l’image définie dans la config.
Mode check avec navigator :
| |
Limiter à certains hosts :
| |
Navigation en mode interactif
Lorsque vous êtes en mode interactif :
Touches de navigation :
↑/↓ouj/k: naviguer dans les listesEnter: entrer dans un élémentEscou0: revenir en arrière:qouCtrl+C: quitter:help: afficher l’aide/: rechercher
Numéros :
- Taper un numéro directement pour aller à cet élément
- Ex:
3suivi deEnterpour aller au 3ème élément
Exploration :
:tasks: voir toutes les tâches:hosts: voir tous les hosts:plays: voir tous les plays:json: voir la représentation JSON
Exemple de workflow interactif :
- Lancer :
ansible-navigator run site.yml -m interactive - Sélectionner un play (ex: taper
1) - Sélectionner une tâche (ex: taper
5) - Voir les détails de la tâche avec les variables utilisées
- Appuyer sur
Escpour revenir - Taper
:jsonpour voir le JSON complet
Explorer un artifact
Relire une exécution passée :
| |
Explication : Permet de naviguer dans une exécution précédente comme si elle venait de se produire. Utile pour le debug et l’audit.
Lister les artifacts :
| |
Extraire des informations d’un artifact :
| |
Explication : Les artifacts sont des fichiers JSON, donc utilisables avec jq pour extraction de données.
Collections avec Navigator
Lister les collections disponibles :
| |
Explication : Affiche toutes les collections disponibles dans l’execution environment.
Explorer une collection :
| |
Afficher les modules d’une collection :
| |
Explication : Documentation interactive des modules avec exemples.
Inventaire avec Navigator
Explorer l’inventaire :
| |
Explication : Interface interactive pour visualiser l’inventaire complet.
Mode liste :
| |
Graph de l’inventaire :
| |
Explication : Affiche l’arborescence des groupes et hosts.
Variables d’un host :
| |
Configuration avec Navigator
Afficher la configuration courante :
| |
Explication : Montre toutes les configurations actives et leur source (fichier, env, défaut).
Dump de la config en YAML :
| |
Afficher seulement certaines sections :
| |
Images et Execution Environments
Lister les images disponibles :
| |
Explication : Affiche toutes les images EE disponibles localement ou configurées.
Détails d’une image :
| |
Builder une image EE personnalisée :
Créer execution-environment.yml :
| |
Construire l’image :
| |
Explication : ansible-builder crée une image de conteneur avec toutes les dépendances spécifiées.
Commandes adhoc avec Navigator
Ping avec navigator :
| |
Explication : exec permet d’exécuter n’importe quelle commande ansible dans l’EE.
Commande shell :
| |
Collection de facts :
| |
Débogage avec Navigator
Verbosité élevée :
| |
Logs détaillés :
| |
Explication :
--lf(log file) : fichier de log--ll(log level) : debug, info, warning, error, critical
Debugger le conteneur EE :
| |
Explication : Ouvre un shell interactif dans l’execution environment pour explorer l’environnement.
Passer des variables d’environnement :
| |
Explication : --penv (pass environment) passe des variables d’environnement du host au conteneur.
Travailler avec des collections privées
Configuration avec token :
Dans ansible.cfg :
| |
Ou avec ansible-navigator.yml :
| |
Comparaison ansible vs ansible-navigator
| Aspect | ansible-playbook | ansible-navigator |
|---|---|---|
| Environnement | Système hôte | Conteneur (EE) |
| Reproductibilité | Dépend du système | Garantie par l’image |
| Dépendances | Installation manuelle | Incluses dans l’EE |
| Interface | Sortie texte linéaire | TUI interactive |
| Artifacts | Logs basiques | JSON détaillé |
| Debug | Limité | Navigation complète |
| Isolation | Aucune | Complète |
| Performance | Légèrement plus rapide | Overhead du conteneur (~5%) |
Quand utiliser quoi ?
Utilisez ansible-playbook si :
- Environnement simple et stable
- Pas besoin de reproductibilité stricte
- Scripts d’automatisation légers
- Ressources limitées (pas de runtime de conteneurs)
Utilisez ansible-navigator si :
- Environnements multiples (dev, staging, prod)
- Équipes distribuées nécessitant la même configuration
- Besoin d’audit et traçabilité détaillée
- Collections avec dépendances Python complexes
- CI/CD nécessitant isolation
Migration de ansible vers ansible-navigator
Étape 1 : Installer les prérequis :
| |
Étape 2 : Tester avec l’image par défaut :
| |
Étape 3 : Créer la configuration :
| |
Étape 4 : Adapter les playbooks :
Pas de changement nécessaire ! Les playbooks sont 100% compatibles.
Étape 5 : Gérer les collections :
Créer requirements.yml :
| |
Installer dans l’EE :
| |
Ou builder une image personnalisée avec les collections pré-installées.
Bonnes pratiques
Organisation du projet
Structure recommandée :
| |
Sécurité
1. Toujours utiliser Ansible Vault pour les secrets :
| |
Convention de nommage :
| |
Utilisation dans les playbooks :
| |
2. Ne jamais commiter de secrets non chiffrés :
Ajouter au .gitignore :
| |
3. Utiliser become seulement quand nécessaire :
| |
4. Limiter les permissions sudo :
Sur les managed nodes, /etc/sudoers.d/ansible :
| |
Performance
1. Activer le pipelining :
Dans ansible.cfg :
| |
Explication : Réduit le nombre de connexions SSH en envoyant plusieurs commandes par connexion.
2. Utiliser mitogen (stratégie alternative) :
| |
Dans ansible.cfg :
| |
Explication : Peut accélérer l’exécution de 1.5x à 7x selon les cas.
3. Parallélisme :
| |
Explication : Nombre de hosts traités simultanément. Par défaut : 5.
4. Désactiver la collecte des facts si non nécessaire :
| |
5. Utiliser async pour les tâches longues :
| |
Idempotence
Principe : Un playbook doit pouvoir être exécuté plusieurs fois sans effets secondaires.
Mauvais exemple :
| |
Bon exemple :
| |
Utiliser changed_when pour contrôler :
| |
Tests
1. Tester la syntaxe :
| |
2. Mode check avant déploiement :
| |
3. Utiliser Molecule pour tester les roles :
| |
4. Linter avec ansible-lint :
| |
Documentation
1. Commenter les playbooks :
| |
2. Documenter les variables :
Dans roles/nginx/README.md :
| |
3. Utiliser des tags pour la documentation :
| |
Versioning
1. Versionner les roles avec Galaxy :
Dans meta/main.yml :
| |
2. Pinning des versions de collections :
| |
3. Utiliser des branches Git :
| |
Gestion des erreurs
1. Ignorer les erreurs contrôlées :
| |
2. Définir des conditions d’échec personnalisées :
| |
3. Bloc rescue pour gestion avancée :
| |
CI/CD Integration
Exemple GitLab CI :
| |
Ressources complémentaires
Documentation officielle :
Collections essentielles :
ansible.builtin: modules de basecommunity.general: modules communautaires variésansible.posix: modules Unix/Linuxcommunity.docker: gestion Dockerkubernetes.core: gestion Kubernetes
Outils connexes :
- Ansible Builder : création d’execution environments
- Molecule : testing de roles
- ansible-lint : linting de playbooks
- AWX / Automation Controller : interface web pour Ansible
Bonnes pratiques de la communauté :
Dernière mise à jour : Octobre 2025