Aller au contenu

Testing d'infrastructure

Tester l'infrastructure avec du linting, des tests unitaires, des tests d'intégration et du policy as code.


Pyramide des tests IaC

Comme pour le code applicatif, l'infrastructure se teste a plusieurs niveaux. Plus on monte dans la pyramide, plus les tests sont coûteux en temps et en ressources.

graph BT
    A["Lint<br/>(syntaxe, style, bonnes pratiques)"] --> B["Tests unitaires<br/>(logique des modules, pas de ressources reelles)"]
    B --> C["Tests d'integration<br/>(ressources reelles, validation comportement)"]
    C --> D["Compliance / Policy as Code<br/>(conformite securite et gouvernance)"]

L'objectif : attraper le maximum d'erreurs au niveau le moins coûteux. Un problème de syntaxe détecté par le linter ne doit jamais atteindre un environnement cloud.

Apply sans tests = déploiement sans filet

Un terraform apply sans pipeline de validation, c'est du ClickOps avec plus d'étapes. Le code IaC doit passer les mêmes exigences qualité que le code applicatif : lint, tests, review, pipeline.


Linting

Le linting analyse le code statiquement sans exécuter quoi que ce soit.

tflint

Analyseur statique pour Terraform. Détecté les erreurs de syntaxe, les variables non utilisées, les types incorrects et les violations de bonnes pratiques via des plugins (AWS, Azure, GCP).

ansible-lint

Analyse les playbooks Ansible pour détecter les mauvaises pratiques : utilisation de command à la place d'un module natif, absence de name sur les tasks, handlers non notifies, etc.

yamllint

Validateur syntaxique et stylistique pour les fichiers YAML. Indispensable pour Ansible, Kubernetes, GitHub Actions.

Checkov

Analyse statique de sécurité : détecté les configurations dangereuses dans les fichiers Terraform, CloudFormation, Kubernetes, Dockerfile. Vérifié des centaines de règles de sécurité (bucket S3 public, security group trop ouvert, chiffrement désactivé…).


Tests unitaires

Les tests unitaires IaC valident la logique sans provisionner de vraies ressources.

Terratest

Framework Go pour tester des modules Terraform. Les tests provisionent de vraies ressources (dans un compte de test), valident le comportement, puis detruisent tout. Plus lents que le lint — comptez plusieurs minutes par test — mais validant le comportement réel.

Molecule

Framework de test pour les rôles Ansible. Exécuté le rôle dans un conteneur ou une VM (via Docker, Podman, Vagrant), puis vérifié le résultat avec des assertions (Testinfra ou Ansible verify).

Outil Scope Ressources réelles Vitesse
tflint Terraform — syntaxe et règles Non Secondes
ansible-lint Ansible — bonnes pratiques Non Secondes
Checkov Multi — sécurité statique Non Secondes
Terratest Terraform — comportement Oui (compte test) Minutes
Molecule Ansible — comportement rôle Oui (conteneur/VM) Minutes

Policy as code

Le policy as code valide que l'infrastructure respecte des règles de gouvernance et de sécurité, au-delà de la syntaxe.

OPA — Open Policy Agent

Framework générique de policy as code. Le langage Rego permet d'exprimer des règles complexes : "tous les buckets S3 doivent avoir le chiffrement active", "aucune ressource sans le tag env". S'intégré avec Terraform (via terraform-opa), Kubernetes (via Gatekeeper), CI/CD.

Sentinel

Solution proprietary HashiCorp intégrée a Terraform Cloud et Terraform Enterprise. Policies exprimees dans le langage Sentinel, exécutées entre plan et apply. Permet de bloquer un apply non conforme avant qu'il ne se produise.

Checkov (compliance)

En plus du linting de sécurité, Checkov peut valider la conformité par rapport à des frameworks (CIS Benchmarks, PCI-DSS, HIPAA) et générer des rapports.


Intégration CI

Un pipeline IaC complet ressemble a ceci :

graph LR
    A["Push / MR"] --> B["Lint<br/>(tflint, ansible-lint, yamllint)"]
    B --> C["Securite statique<br/>(Checkov)"]
    C --> D["terraform plan<br/>(ou ansible --check)"]
    D --> E["Policy as code<br/>(OPA / Sentinel)"]
    E --> F["Review humaine<br/>+ approbation"]
    F --> G["terraform apply<br/>(environnement cible)"]
    G --> H["Tests integration<br/>(Terratest / Molecule)"]

Plan comme artefact

Sauvegardez le plan Terraform (terraform plan -out=plan.tfplan) comme artefact de la CI. L'apply doit utiliser ce plan exact — pas recalculer. Cela garantit que ce qui a été revue est exactement ce qui sera appliqué.


Outils

Outil Description Lien
tflint Linter Terraform avec plugins cloud github.com/terraform-linters/tflint
ansible-lint Linter pour les playbooks Ansible ansible-lint.readthedocs.io
Checkov Analyse de sécurité et compliance statique checkov.io
Terratest Tests d'intégration pour Terraform en Go terratest.gruntwork.io
Molecule Tests de rôles Ansible molecule.readthedocs.io
OPA Policy as code générique openpolicyagent.org