Vous gérez encore vos serveurs à la main, via une console web ou des scripts bricolés ? Il est temps de passer à l’étape suivante. Terraform est l’outil de référence pour décrire, provisionner et gérer votre infrastructure de manière déclarative, reproductible et versionnée.
Ce guide vous accompagne pas à pas, de l’installation jusqu’au déploiement concret d’un serveur chez Hetzner, en passant par la gestion du state et l’introduction aux modules. Aucun prérequis cloud exotique : on reste sur des providers européens accessibles.
Qu’est-ce que Terraform ?#
Terraform est un outil open source créé par HashiCorp en 2014. Il permet de définir votre infrastructure sous forme de code (Infrastructure as Code, ou IaC) dans un langage déclaratif appelé HCL (HashiCorp Configuration Language).
Le principe est simple : vous décrivez l’état souhaité de votre infrastructure dans des fichiers .tf, et Terraform se charge de créer, modifier ou supprimer les ressources nécessaires pour atteindre cet état.
Pourquoi adopter Terraform ?#
- Reproductibilité — Le même code produit la même infrastructure, à chaque fois. Fini les « ça marchait sur mon setup ».
- Versionnement — Votre infra vit dans Git, avec historique, reviews et rollback.
- Multi-provider — Un seul outil pour Hetzner, Infomaniak, Cloudflare, et des centaines d’autres.
- Planification — Terraform montre exactement ce qu’il va faire avant de le faire (
plan). - Collaboration — Toute l’équipe travaille sur la même base de code, avec des conventions partagées.
Terraform vs Ansible, Pulumi et les autres#
Terraform n’est pas le seul outil d’IaC, mais il occupe une place bien définie :
| Outil | Approche | Force principale |
|---|---|---|
| Terraform | Déclaratif, provisionnement | Gestion du cycle de vie des ressources cloud |
| Ansible | Impératif/déclaratif, configuration | Configuration des serveurs une fois créés |
| Pulumi | Impératif (langages généraux) | IaC en Python, Go, TypeScript |
En pratique, Terraform et Ansible sont souvent complémentaires : Terraform crée les serveurs, Ansible les configure.
Installation de Terraform#
Terraform est un binaire unique, sans dépendance. L’installation prend moins d’une minute.
Sur macOS (Homebrew)#
| |
Sur Linux (Debian/Ubuntu)#
| |
Vérification#
| |
Astuce : Utilisez tfenv pour gérer plusieurs versions de Terraform en parallèle, surtout si vous travaillez sur plusieurs projets.
Les concepts fondamentaux#
Avant d’écrire du code, quelques notions essentielles à comprendre.
Providers#
Un provider est un plugin qui permet à Terraform de communiquer avec une API. Chaque service (Hetzner, Cloudflare, GitHub…) a son propre provider. C’est le pont entre votre code HCL et l’infrastructure réelle.
Resources#
Une resource représente un élément d’infrastructure : un serveur, un réseau, un enregistrement DNS, un volume de stockage. Chaque resource a un type (défini par le provider) et des attributs configurables.
State (état)#
Le state est un fichier JSON (terraform.tfstate) qui contient la cartographie entre vos resources déclarées et les ressources réelles qui existent chez le provider. C’est la mémoire de Terraform — on y reviendra en détail plus loin.
Le workflow Terraform#
Le cycle de travail avec Terraform suit trois commandes clés :
| |
Ce workflow init → plan → apply deviendra votre routine quotidienne.
Premier projet : un serveur Hetzner#
Passons à la pratique. Nous allons déployer un serveur cloud chez Hetzner, un hébergeur allemand réputé pour ses prix compétitifs et ses datacenters européens (Falkenstein, Nuremberg, Helsinki, Ashburn).
Prérequis#
- Un compte Hetzner Cloud (inscription gratuite)
- Un API token généré dans la console Hetzner (Cloud Console → Projet → Security → API Tokens → Generate API Token avec permissions Read & Write)
Structure du projet#
Créez un répertoire propre pour votre premier projet :
| |
Nous allons créer trois fichiers — une convention classique en Terraform :
| |
Configurer le provider Hetzner#
Commençons par variables.tf pour déclarer nos variables :
| |
Ensuite, main.tf avec le provider et notre première resource :
| |
Enfin, outputs.tf pour récupérer les informations utiles après le déploiement :
| |
Premier déploiement#
C’est le moment de vérité. Suivez ces étapes dans l’ordre :
| |
La commande plan affiche un résumé détaillé de ce que Terraform va créer :
| |
Tout est clair ? On applique :
| |
Tapez yes à la confirmation. En quelques secondes, votre serveur est provisionné. Terraform affiche les outputs :
| |
Vous pouvez maintenant vous connecter :
| |
Comprendre le State#
Le state est un concept central en Terraform, et souvent source de confusion pour les débutants. Prenons le temps de bien le comprendre.
À quoi sert le state ?#
Après un terraform apply, Terraform crée un fichier terraform.tfstate dans votre répertoire. Ce fichier JSON contient la correspondance exacte entre vos ressources déclarées en HCL et les ressources réelles chez le provider.
Sans ce fichier, Terraform ne saurait pas :
- Quelles ressources il a déjà créées
- Quels attributs ont changé depuis le dernier apply
- Quelles ressources supprimer si vous les retirez du code
Le state local vs distant#
Par défaut, le state est stocké localement dans terraform.tfstate. Cela pose deux problèmes :
- Collaboration — Si deux personnes appliquent en même temps, le state est corrompu.
- Sécurité — Le state contient des données sensibles (IPs, identifiants…).
La solution : un backend distant. Voici un exemple avec un bucket S3-compatible (disponible chez beaucoup de providers, dont Infomaniak) :
| |
Règles d’or pour le state#
- Ne jamais commit le fichier
terraform.tfstatedans Git. Ajoutez-le à votre.gitignore. - Toujours utiliser un backend distant dès que vous travaillez en équipe.
- Activer le locking pour empêcher les modifications concurrentes.
- Ne jamais éditer le state manuellement, sauf avec
terraform state(commandes dédiées).
| |
Introduction aux modules#
Une fois votre premier projet fonctionnel, vous allez vite vouloir réutiliser du code. C’est exactement le rôle des modules.
Un module Terraform est simplement un répertoire contenant des fichiers .tf. Votre projet actuel est déjà un module — le module racine (root module).
Créer un module réutilisable#
Imaginons un module pour créer un serveur Hetzner avec des paramètres standardisés :
| |
| |
| |
| |
Utiliser le module#
De retour dans votre module racine, appelez le module pour créer plusieurs serveurs :
| |
Après un terraform init (nécessaire quand on ajoute un module), le plan montrera la création des deux serveurs avec leurs configurations respectives.
Bonnes pratiques pour bien démarrer#
Voici les conventions qui vous épargneront des heures de débogage et rendront vos projets maintenables sur le long terme.
1. Structurez vos fichiers#
Même pour un petit projet, séparez vos fichiers par responsabilité :
| |
2. Épinglez vos versions#
Ne laissez jamais Terraform choisir la version du provider :
| |
Commitez aussi le fichier .terraform.lock.hcl — c’est le lockfile des providers, comme un package-lock.json.
3. Utilisez des variables, jamais de valeurs en dur#
Les tokens, noms, tailles d’instance : tout passe par des variables. Les secrets passent par des variables d’environnement préfixées TF_VAR_ :
| |
4. Nommez avec intention#
Adoptez une convention de nommage cohérente dès le début :
| |
5. Validez avant de commit#
Intégrez ces commandes dans votre workflow (ou votre CI) :
| |
6. Utilisez terraform plan religieusement#
Ne faites jamais un apply sans avoir lu le plan. C’est votre filet de sécurité. En CI/CD, sauvegardez le plan pour l’appliquer de manière identique :
| |
7. Nettoyez après vous#
Pour détruire proprement toute l’infrastructure d’un projet de test :
| |
Aller plus loin#
Ce guide couvre les fondations. Voici les prochaines étapes pour progresser :
- Workspaces — Gérer plusieurs environnements (dev, staging, prod) avec le même code.
- Data sources — Interroger des ressources existantes sans les gérer.
- Provisioners — Exécuter des scripts sur les serveurs après création (préférez Ansible pour ça).
- Terraform Cloud / Spacelift — Automatiser les apply dans un pipeline CI/CD.
- Terragrunt — Orchestrer des projets Terraform complexes avec moins de répétition.
- Import — Importer des ressources existantes dans le state avec
terraform importou le blocimport(Terraform 1.5+).
Conclusion#
Terraform transforme la gestion d’infrastructure en un processus prévisible, versionné et collaboratif. Avec les bases couvertes dans ce guide — providers, resources, state, modules et bonnes pratiques — vous avez tout ce qu’il faut pour démarrer concrètement.
Le meilleur conseil : commencez petit. Un serveur, un réseau, un DNS. Itérez. Chaque terraform apply réussi renforce votre compréhension. Et surtout, commitez votre code — votre infrastructure mérite le même soin que votre application.
La courbe d’apprentissage est réelle, mais le retour sur investissement est massif. Une fois que vous aurez goûté au terraform plan avant chaque changement d’infra, vous ne reviendrez plus en arrière.
Cet article fait partie de la série Infrastructure as Code sur devopslab.ch. Retrouvez nos autres guides pour approfondir Terraform, Ansible et les pratiques DevOps modernes.