
Ansible-lint analyse vos playbooks, rôles et collections pour détecter les erreurs avant l’exécution, appliquer les bonnes pratiques et corriger automatiquement de nombreux problèmes. C’est l’outil indispensable pour maintenir un code Ansible de qualité, utilisé notamment par Ansible Galaxy pour calculer les scores de qualité.
Quickstart en 2 minutes
Section intitulée « Quickstart en 2 minutes »pipx install ansible-lintansible-lint --versionAvantage : environnement isolé, indépendant de votre version d’Ansible.
pip install "ansible-lint[yamllint]"ansible-lint --versionLe paquet optionnel yamllint active les règles de formatage YAML.
# Lancer sur un playbookansible-lint playbook.yml
# Lancer sur tout le projet (auto-détection)ansible-lint
# Corriger automatiquement ce qui peut l'êtreansible-lint --fixCe qu’Ansible-lint détecte (et ce qu’il ne fait pas)
Section intitulée « Ce qu’Ansible-lint détecte (et ce qu’il ne fait pas) »| Ansible-lint fait | Ansible-lint ne fait pas |
|---|---|
| Détecte les erreurs de syntaxe | N’exécute pas les playbooks |
| Applique les bonnes pratiques | Ne remplace pas les tests d’intégration |
| Corrige automatiquement (—fix) | Ne corrige pas les erreurs de logique |
| Valide les schémas (meta, galaxy.yml) | Ne vérifie pas les cibles distantes |
Les 6 profils (de permissif à strict)
Section intitulée « Les 6 profils (de permissif à strict) »Les profils permettent une adoption progressive : commencez permissif, durcissez au fil du temps. Chaque profil inclut les règles du profil précédent.
| Profil | Objectif | Quand l’utiliser |
|---|---|---|
| min | Ansible peut charger le fichier | Débogage, code legacy |
| basic | Style cohérent, erreurs courantes | Début de projet |
| moderate | Lisibilité (noms, casing) | Équipe établie |
| safety | Sécurité et idempotence | Pré-production |
| shared | Prêt pour Galaxy/publication | Rôles/collections publics |
| production | Certifié Ansible Automation Platform | Entreprise |
# Voir tous les profils et leurs règlesansible-lint --list-profiles
# Appliquer un profil spécifiqueansible-lint --profile=basic playbook.yml
# Vérifier quel profil passeansible-lint playbook.yml# Sortie : "Last profile that met the validation criteria was 'safety'"Configuration avec .ansible-lint
Section intitulée « Configuration avec .ansible-lint »Créez un fichier .ansible-lint à la racine de votre projet :
---profile: moderate
# Exclure des cheminsexclude_paths: - .cache/ - .git/ - molecule/
# Ignorer certaines règlesskip_list: - no-changed-when # Trop de faux positifs sur nos scripts
# Afficher en warning au lieu d'erreurwarn_list: - experimental - fqcn[deep]
# Activer des règles opt-inenable_list: - yaml - no-log-password - empty-string-compare
# Mode hors ligne (pas de téléchargement de requirements.yml)offline: false
# Pattern pour les noms de variablesvar_naming_pattern: "^[a-z_][a-z0-9_]*$"
# Préfixe pour les variables de boucle dans les rôlesloop_var_prefix: "^(__|{role}_)"Correction automatique avec —fix
Section intitulée « Correction automatique avec —fix »L’option --fix corrige automatiquement de nombreuses erreurs. C’est la fonctionnalité la plus utile pour gagner du temps.
Règles auto-corrigibles
Section intitulée « Règles auto-corrigibles »| Règle | Ce qui est corrigé |
|---|---|
fqcn | command: → ansible.builtin.command: |
name | this task → This task (majuscule) |
yaml | Formatage YAML (indentation, espaces) |
no-free-form | Syntaxe libre → syntaxe structurée |
key-order | Réordonne les clés selon la convention |
jinja | {{var}} → {{ var }} (espaces) |
no-jinja-when | when: "{{ }}" → when: sans Jinja |
partial-become | Ajoute become: true manquant |
Exemples pratiques
Section intitulée « Exemples pratiques »# Corriger tout le projetansible-lint --fix
# Corriger uniquement les FQCNansible-lint --fix=fqcn
# Corriger plusieurs règles spécifiquesansible-lint --fix=fqcn,name,yaml
# Ne rien corriger (désactiver les transforms)ansible-lint --fix=noneAvant / Après
Section intitulée « Avant / Après »Avant correction :
---- hosts: all gather_facts: no tasks: - name: install package apt: name: nginx state: presentAprès ansible-lint --fix :
---- hosts: all gather_facts: false tasks: - name: Install package ansible.builtin.apt: name: nginx state: presentCorrections appliquées :
no→false(yaml[truthy])install→Install(name[casing])apt:→ansible.builtin.apt:(fqcn)
Ignorer des règles spécifiques
Section intitulée « Ignorer des règles spécifiques »Méthode 1 : commentaire noqa (pour une tâche)
Section intitulée « Méthode 1 : commentaire noqa (pour une tâche) »- name: Clone repository without using git module # noqa: command-instead-of-module ansible.builtin.command: git clone https://example.com/repo changed_when: false# Ignorer plusieurs règles- name: Risky but necessary # noqa: risky-shell-pipe no-changed-when ansible.builtin.shell: cat /etc/passwd | grep rootMéthode 2 : fichier .ansible-lint-ignore (pour un fichier)
Section intitulée « Méthode 2 : fichier .ansible-lint-ignore (pour un fichier) »# Générer automatiquement le fichier d'ignoreansible-lint --generate-ignoreContenu généré :
playbook-legacy.yml command-instead-of-moduleplaybook-legacy.yml fqcn[action-core]playbook-legacy.yml no-changed-whenMéthode 3 : tag skip_ansible_lint (legacy)
Section intitulée « Méthode 3 : tag skip_ansible_lint (legacy) »- name: Task à ignorer complètement ansible.builtin.git: repo: https://example.com/repo dest: /tmp/repo tags: - skip_ansible_lintIntégration CI/CD
Section intitulée « Intégration CI/CD »Pre-commit
Section intitulée « Pre-commit »---repos: - repo: https://github.com/ansible/ansible-lint rev: v26.1.1 hooks: - id: ansible-lint # Si vous utilisez des collections externes : # additional_dependencies: # - ansible# Installer pre-commitpip install pre-commitpre-commit install
# Exécuter manuellementpre-commit run ansible-lint --all-filesGitHub Actions
Section intitulée « GitHub Actions »name: Ansible Linton: [push, pull_request]
jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5
- name: Run ansible-lint uses: ansible/ansible-lint@main # with: # args: "--profile=production"GitLab CI
Section intitulée « GitLab CI »ansible-lint: image: python:3.12-slim stage: lint before_script: - pip install ansible-lint script: - ansible-lint --profile=moderate rules: - changes: - "**/*.yml" - "**/*.yaml"Créer vos propres règles
Section intitulée « Créer vos propres règles »Pour des besoins spécifiques à votre organisation, créez des règles personnalisées :
from ansiblelint.rules import AnsibleLintRule
class NoHardcodedPasswords(AnsibleLintRule): id = "custom-no-passwords" shortdesc = "Ne pas hardcoder de mots de passe" description = "Les mots de passe doivent venir de variables ou vault" tags = ["security", "custom"]
def matchtask(self, task, file=None): for key in ["password", "passwd", "secret"]: if key in str(task.get("ansible.builtin.user", {})): value = task["ansible.builtin.user"].get(key, "") if not value.startswith("{{"): return True return False# Utiliser avec les règles par défautansible-lint -R -r ./rules/
# Utiliser uniquement vos règlesansible-lint -r ./rules/Dépannage
Section intitulée « Dépannage »| Problème | Cause probable | Solution |
|---|---|---|
No such file or directory | Chemin invalide | Lancer depuis la racine du projet |
Syntax check failed | Erreur YAML | Corriger la syntaxe avec yamllint |
Unable to resolve FQCN | Collection manquante | Installer avec ansible-galaxy collection install |
Too many violations | Projet legacy | Utiliser --generate-ignore pour démarrer |
| Pre-commit échoue | Collections non trouvées | Ajouter additional_dependencies: [ansible] |
Faux positifs sur no-changed-when | Commands idempotentes | Ajouter # noqa: no-changed-when avec commentaire |
Lister les règles et tags disponibles
Section intitulée « Lister les règles et tags disponibles »# Toutes les règlesansible-lint --list-rules
# Toutes les règles avec leurs tagsansible-lint -T
# Uniquement certains tagsansible-lint -t idempotency playbook.ymlansible-lint -t security playbook.yml
# Exclure certains tagsansible-lint -x formatting,metadata playbook.ymlÀ retenir
Section intitulée « À retenir »ansible-lint --fixcorrige automatiquement FQCN, casing, YAML et autres problèmes — utilisez-le systématiquement- 6 profils de
minàproduction— commencez avecbasic, montez progressivement .ansible-lintcentralise la configuration — committez ce fichier# noqa: rule-idignore une règle sur une ligne — préférez cette syntaxe àskip_list--generate-ignoregénère un fichier d’ignore pour le code legacy — permet l’adoption progressive- Intégrez en CI/CD avec pre-commit ou GitHub Actions — détectez les erreurs avant le merge
- Le code de sortie 8 (v26+) indique que des corrections ont été appliquées avec succès
- Exécutez toujours depuis la racine du projet, sinon ansible-lint ne trouvera pas les fichiers