Aller au contenu
Infrastructure as Code medium

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

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

Une configuration de lint ne prouve sa valeur que le jour où elle bloque un commit. Le lab vous fait poser les trois fichiers de cette page, .ansible-lint en profil production, un .yamllint strict et le .pre-commit-config.yaml qui les enchaîne, puis y ajouter un hook qui refuse une clé privée committée par erreur. La validation relit chaque fichier et exige que le profil, les règles strictes et le hook anti-fuite soient effectivement branchés.

  • 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