Aller au contenu
Infrastructure as Code medium

ansible-lint profile production : configuration stricte pour rôles publiés

9 min de lecture

Logo Ansible

ansible-lint --profile=production est le filtre qualité le plus strict d’ansible-lint. Il vérifie ~80 règles : FQCN partout, pas de command: sans creates:, présence d’argument_specs.yml, gestion des secrets, naming conventions. Tout rôle destiné à publication doit passer ce profil.

Cette page configure ansible-lint, yamllint et pre-commit ensemble — la stack qualité 2026 pour un rôle Ansible.

  • Les 6 profils d’ansible-lint (min → production).
  • Configurer .ansible-lint avec exclude_paths, warn_list, mock_modules.
  • Configurer .yamllint strict (pas de yes/no ambigus).
  • Pre-commit hooks pour bloquer les commits non conformes.
  • Tester le linter en local et en CI.
min → basic → moderate → safety → shared → production

Chaque profil englobe les règles des précédents. Plus on monte, plus c’est strict.

ProfilCas d’usage
minPremier déchiffrage YAML/Ansible — quasi tout passe
basicConventions de base (FQCN, naming)
moderate+ idempotence, no_log, secret detection
safety+ sécurité avancée (no shell sans creates, no_log password)
shared+ qualité des rôles partagés (README, meta)
production+ argument_specs, version pinning, exhaustivité

Recommandation 2026 : moderate pendant le dev, production avant publication.

---
profile: production
exclude_paths:
- .cache/
- .git/
- molecule/
- tests/
skip_list: [] # règles ignorées (avec justification)
warn_list:
- experimental # règles expérimentales en warn
- role-name # autorise les '-' dans noms (Galaxy)
use_default_rules: true
verbosity: 1
enable_list:
- args
- empty-string-compare
- no-log-password
- no-same-owner
- yaml
mock_modules:
- amazon.aws.ec2_instance # collections optionnelles non installées
mock_roles:
- geerlingguy.docker

Champs clés :

  • profile: production : la base.
  • exclude_paths : chemins à ignorer (cache, tests Molecule).
  • skip_list : règles à skipper (à utiliser avec parcimonie + justification en commentaire).
  • warn_list : règles en warn au lieu d’erreur.
  • mock_modules / mock_roles : modules/rôles cités dans le code mais non installés (évite les warnings).
---
extends: default
rules:
line-length:
max: 160
level: warning
truthy:
allowed-values:
- "true"
- "false"
check-keys: false
comments:
min-spaces-from-content: 1
comments-indentation: false
document-start: enable
empty-lines:
max: 2
ignore: |
.cache/
molecule/
.tox/

Règle critiquetruthy.allowed-values: [true, false] : interdit yes/no/on/off qui sont des strings en YAML 1.2 strict (et provoquent des comportements subtils).

.pre-commit-config.yaml
---
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.6.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
- id: check-yaml
- id: check-added-large-files
- id: detect-private-key
- id: check-merge-conflict
- repo: https://github.com/adrienverge/yamllint.git
rev: v1.35.1
hooks:
- id: yamllint
args: [-c, .yamllint]
- repo: https://github.com/ansible/ansible-lint
rev: v25.1.0
hooks:
- id: ansible-lint
args: ["--profile=production"]
additional_dependencies:
- ansible-core>=2.16

Installation :

Fenêtre de terminal
pipx install pre-commit
pre-commit install # active les hooks
pre-commit run --all-files # lance sur tout le repo (1ère fois)

À partir de là, git commit déclenche automatiquement les linters. Si un hook échoue, le commit est bloqué — vous corrigez, vous re-stagez, vous re-commitez.

Fenêtre de terminal
# yamllint
yamllint roles/
# ansible-lint
ansible-lint --profile=production roles/webserver/
# Pre-commit (équivalent au hook automatique)
pre-commit run --all-files
# Pre-commit hook spécifique
pre-commit run ansible-lint --all-files
RègleDétecteFix
fqcn[action-core]Module sans FQCN (dnf: au lieu de ansible.builtin.dnf:)Toujours FQCN
argsArgument manquant requisAjouter le param
no-changed-whencommand: sans changed_when:Ajouter changed_when: false ou creates:
no-log-passwordVariable *password* sans no_log: trueAjouter no_log: true sur la tâche
var-namingVariable mal nomméesnake_case + préfixe rôle
meta-no-infometa/main.yml incompletCompléter galaxy_info:
latest-versionstate: latest sur paquetPinner avec state: present, version: X
- name: Lancer le script de migration legacy
ansible.builtin.shell: /opt/migrate.sh
args:
creates: /var/lib/.migrated
# noqa: command-instead-of-shell
# Le script fait du redirect bash incompatible avec command:

# noqa: <règle> désactive localement la règle. Toujours justifier en commentaire — sinon code review bloque.

Cette page a un lab d’accompagnement : labs/tests/ansible-lint-production/ dans stephrobert/ansible-training.

Le lab fournit .ansible-lint (production), .yamllint (strict), .pre-commit-config.yaml (hooks). 7 tests structure validés.

Fenêtre de terminal
cd ~/Projets/ansible-training/labs/tests/ansible-lint-production/
cat .ansible-lint
cat .yamllint
cat .pre-commit-config.yaml
pytest -v challenge/tests/

Pour tester en réel :

Fenêtre de terminal
ansible-lint --profile=production roles/
yamllint roles/
pre-commit run --all-files
  • 6 profils ansible-lint : minbasicmoderatesafetysharedproduction.
  • production mandatory pour publication Galaxy.
  • .yamllint : interdire yes/no (truthy.allowed-values: [true, false]).
  • Pre-commit hooks = ansible-lint, yamllint, detect-private-key, check-yaml.
  • # noqa: <règle> + commentaire pour skip local justifié.

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