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 critique, truthy.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 tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn