Aller au contenu
Infrastructure as Code medium

ansible-lint dès le premier playbook : prendre le bon réflexe

8 min de lecture

Logo Ansible

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.

  • 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.

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 de with_*, 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: 0644 non 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.
Fenêtre de terminal
# Via pip (recommandé — version la plus récente)
pip install --user ansible-lint
# Ou via dnf sur RHEL/AlmaLinux/Rocky
sudo dnf install ansible-lint
# Vérifier
ansible-lint --version

Sur le playbook que vous avez créé dans le premier playbook :

Fenêtre de terminal
ansible-lint premier-playbook.yml

Sortie 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: copy

Chaque ligne suit le format :

<rule-id>: <description courte>
<fichier>:<ligne> <contexte>
ÉlémentRôle
rule-idIdentifiant unique (fqcn[action-core], name[casing]) — utilisable pour --skip-list ou config
DescriptionCe qui ne va pas, en 1 phrase
Fichier:ligneLocalisation précise dans votre playbook

3 niveaux de sévérité : fatal (rouge — corriger absolument), warning (jaune), notice (gris).

Rule IDCas typiqueFix
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-permissionscopy: sans mode:Toujours préciser mode: "0644"
no-changed-whencommand: sans changed_when:Ajouter changed_when: false (lecture seule) ou expression

Plus de détails par règle dans la page complète.

Fenêtre de terminal
# Voir ce qui SERAIT modifie (dry-run)
ansible-lint --fix --dry-run premier-playbook.yml
# Appliquer pour de vrai
ansible-lint --fix premier-playbook.yml

Migrations automatiques courantes :

  • with_items: / with_dict: / with_subelements:loop: + filtres Jinja2.
  • dnf:ansible.builtin.dnf: (FQCN).
  • name: fooname: 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.

Pour skipper des règles dans un projet (rarement justifié, mais utile) :

# .ansible-lint a la racine du projet
profile: 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.

Trois options, du plus simple au plus automatisé :

Fenêtre de terminal
# Avant chaque ansible-playbook
ansible-lint premier-playbook.yml && ansible-playbook premier-playbook.yml

Le && garantit que le playbook ne tourne pas si le lint a échoué.

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.

Bloquer les commits qui ne passent pas le lint :

.pre-commit-config.yaml
repos:
- repo: https://github.com/ansible/ansible-lint
rev: v25.0.0
hooks:
- id: ansible-lint
Fenêtre de terminal
pre-commit install

Désormais chaque git commit lance ansible-lint automatiquement — un commit avec des erreurs lint est refusé.

SymptômeCauseFix
Could not find Ansible configansible-lint cherche ansible.cfg ou roles/Ignorer le warning, ou créer ansible.cfg minimal
Règle skip silencieusementRègle dans skip_list: du .ansible-lintAuditer le skip_list — chaque entrée mérite une justification
--fix casse l’idempotenceMigration with_subelementsloop: mal interprétéeToujours tester après --fix, lire le diff
Profile trop strictproduction impose 41 règlesDémarrer avec profile: basic, monter progressivement
  • Linter avant de débugger = réflexe n°1 du praticien Ansible.
  • pip install --user ansible-lint suffit 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn