Terraform — Concepts fondamentaux

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Infrastructure as Code déclarative
Éditeur HashiCorp (fork libre : OpenTofu)
Langage HCL (HashiCorp Configuration Language)
Cycle de vie init · plan · apply · destroy
Pièce sensible le state
Voir aussi Terraform — Modules et variables · Terraform — Providers on-prem · Frontière IaC — Terraform, Ansible, GitOps · Crossplane — Panorama

Terraform est un outil d'Infrastructure as Code déclaratif édité par HashiCorp. Il décrit l'état souhaité d'une infrastructure dans un langage dédié (le HCL), calcule l'écart entre cet état souhaité et l'état réel, puis applique les changements nécessaires via les API des fournisseurs (providers). Cette page couvre le socle : le cycle de vie, le HCL, les providers et surtout le state.

Modèle déclaratif

On ne décrit pas la suite d'actions à mener (mode impératif), mais le résultat attendu. Terraform se charge de déterminer les opérations (créer, modifier, détruire) pour converger vers cet état. C'est la même philosophie que Kubernetes appliquée à l'infrastructure sous-jacente.

Cycle de vie plan / apply

<mermaid> flowchart LR

   W[Code HCL
*.tf] --> I[terraform init
providers + backend] I --> P[terraform plan
diff état souhaité / réel] P --> A[terraform apply
convergence via API] A --> S[(State)] S -.lecture.-> P A --> D[terraform destroy
suppression]

</mermaid>

  • init — télécharge les providers, initialise le backend (emplacement du state) et les modules.
  • plan — construit le graphe de dépendances, interroge les API pour lire l'état réel, et produit le diff (create / update / replace / destroy). Ne modifie rien.
  • apply — exécute le plan dans l'ordre du graphe (parallélisme automatique des ressources indépendantes).
  • destroy — détruit les ressources gérées par le state.

HCL (HashiCorp Configuration Language)

Langage déclaratif à blocs. Éléments principaux :

terraform {
  required_version = ">= 1.6"
  required_providers {
    vsphere = { source = "hashicorp/vsphere", version = "~> 2.7" }
  }
}

provider "vsphere" {
  vsphere_server = var.vcenter
}

resource "vsphere_virtual_machine" "vm" {
  name = "rke2-node-01"
  # ...
}

data "vsphere_datacenter" "dc" {
  name = "DC-Toulouse"
}
  • resource — objet géré par Terraform (créé/modifié/détruit).
  • data — lecture d'un objet existant, non géré (référence).
  • provider — configuration d'un fournisseur.
  • variable / output / locals — voir Terraform — Modules et variables.

Providers

Un provider est un plugin qui traduit les ressources HCL en appels d'API. Il en existe pour le cloud public (AWS, Azure, GCP), l'on-prem (vSphere, Rancher), les services (Vault, PostgreSQL, GitLab), etc. Chaque provider est versionné indépendamment.

Le state

Le state est le fichier (par défaut terraform.tfstate, JSON) qui recense les ressources gérées et fait le lien entre identifiants HCL et identifiants réels (ID, ARN, UUID). C'est la pièce la plus sensible.

Backend distant

En équipe, on ne conserve jamais le state en local. On utilise un backend distant : stockage objet (S3/MinIO), Consul, PostgreSQL, GitLab-managed state, Terraform/OpenTofu Cloud… Le backend distant assure la centralisation et, généralement, le verrouillage.

Verrouillage (state locking)

Pour éviter deux apply concurrents qui corrompraient le state, le backend pose un verrou pendant l'opération (ex. DynamoDB pour S3, verrou natif pour PostgreSQL/Consul). Un verrou orphelin se lève avec terraform force-unlock — à manier avec précaution.

Drift

Le drift est l'écart entre le state et la réalité, causé par une modification hors Terraform (console web, correctif manuel). terraform plan le révèle : Terraform proposera de « corriger » la réalité pour la ramener à l'état déclaré. terraform refresh (ou -refresh-only) met à jour le state sans changer l'infra.

Secrets dans le state

Le state contient en clair les attributs sensibles (mots de passe, clés). Il doit donc être chiffré au repos (chiffrement du backend) et à accès restreint. Ne jamais versionner un state en clair dans Git.

Note : licence et OpenTofu

Depuis août 2023, Terraform est distribué sous licence BUSL (source-available, non OSI). Un fork communautaire, OpenTofu (Linux Foundation), reprend la base sous licence MPL 2.0 et reste compatible HCL/provider. Pertinent en contexte de souveraineté et de pérennité : les concepts de cette page s'appliquent à l'identique aux deux outils.

Voir aussi