
Linter avant de débugger — c’est le réflexe qui transforme un débutant en praticien. ansible-lint détecte en secondes les erreurs prévisibles : oubli de FQCN, mode: non quoté, with_items legacy, command: sans changed_when, missing name:. Sans linter, vous découvrez ces problèmes au runtime sur 50 hôtes — bien plus douloureux.
Cette page vous fait passer de 0 à “linter activé” en 10 minutes. Pour creuser (profils, CI/CD, configuration avancée), allez sur la page complète ansible-lint.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Pourquoi linter dès le premier playbook (et pas plus tard).
- Installer ansible-lint en 1 commande.
- Lancer ansible-lint et lire la sortie (rule IDs, sévérités).
- Corriger automatiquement avec
--fix. - Top 5 règles que vous croiserez sur vos premiers playbooks.
Pourquoi linter dès le départ
Section intitulée « Pourquoi linter dès le départ »Trois bénéfices concrets :
- Erreurs catchées en local (sans utiliser SSH ni les managed nodes) — feedback en quelques secondes.
- Conformité RHCE 2026 — le linter applique les conventions modernes (FQCN obligatoire,
loop:au lieu dewith_*, etc.). En suivant ses recommandations, vous apprenez les bons réflexes. - Lecture de code par d’autres — le code linté est homogène et plus facile à reviewer en équipe.
Inversement, ne pas linter mène à :
- Apprendre des anti-patterns sans s’en rendre compte (
mode: 0644non quoté,with_items:legacy). - Découvrir des erreurs au runtime sur le managed node — moins lisible, plus long.
- Faire des review code chronophages où chaque convention doit être discutée à la main.
Installation
Section intitulée « Installation »# Via pip (recommandé — version la plus récente)pip install --user ansible-lint
# Ou via dnf sur RHEL/AlmaLinux/Rockysudo dnf install ansible-lint
# Vérifieransible-lint --versionPremier run sur votre playbook
Section intitulée « Premier run sur votre playbook »Sur le playbook que vous avez créé dans le premier playbook :
ansible-lint premier-playbook.ymlSortie typique (sur un playbook débutant) :
WARNING: PRE RUN: Profile 'production' is selected which has 41 rules.WARNING: Listing 5 violation(s) that are fatal
name[casing]: All names should start with an uppercase letter.premier-playbook.yml:5 Task name: 'install httpd'
fqcn[action-core]: Use FQCN for builtin module actions (dnf).premier-playbook.yml:6 Task/Handler: dnf
no-changed-when: Commands should not change things if nothing needs doing.premier-playbook.yml:14 Task/Handler: command
yaml[indentation]: Wrong indentation: expected 4 but found 2.premier-playbook.yml:8
risky-file-permissions: File permissions unset or incorrect.premier-playbook.yml:11 Task/Handler: copyLire la sortie
Section intitulée « Lire la sortie »Chaque ligne suit le format :
<rule-id>: <description courte><fichier>:<ligne> <contexte>| Élément | Rôle |
|---|---|
rule-id | Identifiant unique (fqcn[action-core], name[casing]) — utilisable pour --skip-list ou config |
| Description | Ce qui ne va pas, en 1 phrase |
| Fichier:ligne | Localisation précise dans votre playbook |
3 niveaux de sévérité : fatal (rouge — corriger absolument), warning (jaune), notice (gris).
Top 5 règles que vous croiserez
Section intitulée « Top 5 règles que vous croiserez »| Rule ID | Cas typique | Fix |
|---|---|---|
fqcn[action-core] | dnf: au lieu de ansible.builtin.dnf: | Préfixer avec ansible.builtin. |
name[missing] | Tâche sans name: | Ajouter name: "Description claire" |
name[casing] | name: "install httpd" (minuscule) | name: "Install httpd" (majuscule initiale) |
risky-file-permissions | copy: sans mode: | Toujours préciser mode: "0644" |
no-changed-when | command: sans changed_when: | Ajouter changed_when: false (lecture seule) ou expression |
Plus de détails par règle dans la page complète.
Auto-correction avec --fix
Section intitulée « Auto-correction avec --fix »# Voir ce qui SERAIT modifie (dry-run)ansible-lint --fix --dry-run premier-playbook.yml
# Appliquer pour de vraiansible-lint --fix premier-playbook.ymlMigrations automatiques courantes :
with_items:/with_dict:/with_subelements:→loop:+ filtres Jinja2.dnf:→ansible.builtin.dnf:(FQCN).name: foo→name: Foo(capitalisation).
À auditer après --fix :
- Cas où la migration
with_*→loop:change la sémantique (rare mais possible). - Cas où le linter ne sait pas combler une règle (vous devez le faire à la main).
Toujours committer avant --fix — vous pouvez vouloir revenir en arrière.
Configuration .ansible-lint
Section intitulée « Configuration .ansible-lint »Pour skipper des règles dans un projet (rarement justifié, mais utile) :
# .ansible-lint a la racine du projetprofile: production # production | shared | safety | basic | min
skip_list: - 'no-changed-when' # Pour des labs ou les commands sont demonstratives
exclude_paths: - .cache/ - tests/integration/Profils :
min— bare minimum (syntaxe valide).basic— quelques règles essentielles.safety— sécurité (no shell pipe, no risky perms).shared— pour rôles partagés.production— toutes les règles (défaut RHCE 2026).
Plus de détails dans la page complète — section profils.
Intégrer dans votre workflow
Section intitulée « Intégrer dans votre workflow »Trois options, du plus simple au plus automatisé :
En CLI manuel
Section intitulée « En CLI manuel »# Avant chaque ansible-playbookansible-lint premier-playbook.yml && ansible-playbook premier-playbook.ymlLe && garantit que le playbook ne tourne pas si le lint a échoué.
Dans VS Code (extension)
Section intitulée « Dans VS Code (extension) »Installer l’extension redhat.ansible : elle intègre ansible-lint
au fil de la frappe. Erreurs visibles directement dans le code, sans
même lancer ansible-lint en CLI.
En pre-commit hook
Section intitulée « En pre-commit hook »Bloquer les commits qui ne passent pas le lint :
repos: - repo: https://github.com/ansible/ansible-lint rev: v25.0.0 hooks: - id: ansible-lintpre-commit installDésormais chaque git commit lance ansible-lint automatiquement — un commit avec des erreurs lint est refusé.
Pièges typiques
Section intitulée « Pièges typiques »| Symptôme | Cause | Fix |
|---|---|---|
Could not find Ansible config | ansible-lint cherche ansible.cfg ou roles/ | Ignorer le warning, ou créer ansible.cfg minimal |
| Règle skip silencieusement | Règle dans skip_list: du .ansible-lint | Auditer le skip_list — chaque entrée mérite une justification |
--fix casse l’idempotence | Migration with_subelements → loop: mal interprétée | Toujours tester après --fix, lire le diff |
| Profile trop strict | production impose 41 règles | Démarrer avec profile: basic, monter progressivement |
À retenir
Section intitulée « À retenir »- Linter avant de débugger = réflexe n°1 du praticien Ansible.
pip install --user ansible-lintsuffit pour démarrer.ansible-lint <fichier>.yml= run,--fix= auto-correction.- Top 5 règles :
fqcn,name,risky-file-permissions,no-changed-when,yaml[indentation]. - VS Code + extension
redhat.ansible= lint en temps réel. pre-commit hook= bloquer les commits non-lintés.