Objectifs
- Définir ce qu’est l’Infrastructure as Code (IaC) et son importance en DevOps.
- Comprendre les problèmes liés à la gestion manuelle de l’infrastructure.
- Distinguer l’approche impérative (“comment”) de l’approche déclarative (“quoi”).
- Découvrir les principaux outils du marché comme Terraform et Ansible.
Le problème : La gestion manuelle de l’infrastructure
Traditionnellement, les serveurs, réseaux, et bases de données étaient configurés manuellement : en cliquant dans une interface web de fournisseur cloud, ou en se connectant en SSH pour lancer des commandes.
Cette approche cause des problèmes majeurs :
- Dérive de configuration (“Configuration Drift”) : Avec le temps, des petits changements manuels non documentés s’accumulent, et les environnements (ex: staging et production) deviennent différents et incohérents.
- Manque de reproductibilité : Il est presque impossible de recréer un environnement complexe à l’identique.
- Lenteur et erreurs humaines : Le provisionnement manuel est lent, fastidieux et sujet aux erreurs.
La solution : l’Infrastructure as Code (IaC)
L’Infrastructure as Code est la pratique qui consiste à gérer et provisionner son infrastructure (serveurs, réseaux, load balancers, bases de données…) à travers des fichiers de code plutôt qu’une configuration manuelle.
L’infrastructure devient un “artefact” comme un autre. Elle est décrite dans des fichiers, stockée dans Git, et peut être testée et déployée via des pipelines de CI/CD.
Impératif vs. Déclaratif
Il y a deux grandes approches en IaC :
-
Impérative (“Comment faire”) Vous écrivez un script qui détaille étape par étape les commandes à exécuter pour atteindre l’état désiré.
- Exemple : Un script shell qui lance
aws ec2 create-instance, puis attend, puis lanceaws ec2 attach-volume… - Outils : Scripts Bash, Ansible.
- Exemple : Un script shell qui lance
-
Déclarative (“Ce que je veux”) Vous décrivez l’état final souhaité dans un fichier de configuration, et l’outil se charge de déterminer les actions à entreprendre pour y arriver.
- Exemple : Un fichier Terraform qui dit “Je veux une instance EC2 de type t3.micro et un volume de 10GB attaché”. Si l’instance n’existe pas, Terraform la crée. Si elle existe mais que le type est mauvais, Terraform la modifie.
- Outils : Terraform, Kubernetes YAML.
L’approche déclarative est aujourd’hui privilégiée car elle est plus robuste et plus facile à maintenir.
Les bénéfices de l’IaC
- Automatisation : Provisionnement rapide, fiable et reproductible de n’importe quel environnement.
- Traçabilité et Versioning : En stockant le code dans Git, vous avez un historique complet de qui a changé quoi, quand, et pourquoi.
- Collaboration : Les équipes peuvent collaborer sur l’évolution de l’infrastructure via des Pull Requests, comme pour le code applicatif.
- Réduction des coûts : Permet d’éteindre et de recréer des environnements de test à la demande.
Les outils majeurs
- Terraform : L’outil open source de référence pour le provisionnement d’infrastructure multi-cloud. Il est déclaratif et permet de gérer des ressources chez AWS, Azure, Google Cloud, et des centaines d’autres fournisseurs.
- Ansible : L’outil de référence pour la gestion de configuration. Son rôle est de configurer des serveurs existants (installer des logiciels, gérer des fichiers de configuration, démarrer des services).
- Pulumi : Une alternative moderne à Terraform qui permet de définir l’infrastructure dans des langages de programmation comme Python, TypeScript ou Go.
- CloudFormation / ARM / Bicep : Les outils d’IaC natifs à chaque grand fournisseur cloud (AWS, Azure).
Bonnes pratiques
- Tout est dans Git : La seule source de vérité pour l’état de votre infrastructure doit être votre dépôt Git.
- Ne jamais faire de changements manuels en production. Si un changement est nécessaire, il doit passer par une modification du code IaC et une revue.
- Tester votre code IaC. Des outils existent pour valider et tester vos configurations avant de les appliquer.
Exercices
-
Réflexion sur l’approche manuelle :
- Pensez à la dernière fois que vous avez configuré un service ou une machine manuellement.
- Quelles étapes avez-vous suivies ? Comment pourriez-vous les décrire dans un simple fichier texte ? Serait-ce une liste d’instructions (impératif) ou une description du résultat final (déclaratif) ?
-
Comparaison d’outils :
- Cherchez sur Internet un exemple de “création de serveur web” avec un script Bash, puis avec Ansible, puis avec Terraform.
- Sans entrer dans les détails techniques, observez la différence d’approche et de syntaxe. Laquelle vous semble la plus claire et la plus maintenable ?