Aller au contenu
Infrastructure as Code medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Les workspaces Terraform

10 min de lecture

logo terraform

Un workspace Terraform est une copie isolée du state au sein d’un même projet. Un seul jeu de fichiers .tf, mais plusieurs états logiques. Avec un backend local, chaque workspace finit par avoir son propre fichier de state. Avec un backend distant, les workspaces restent dans le même backend et partagent les mêmes credentials. Le workspace par défaut s’appelle default et existe dès le premier terraform init. Les workspaces supplémentaires se créent avec terraform workspace new.

Prérequis : avoir suivi les premières infrastructures et comprendre le state Terraform.

  • Créer un workspace avec terraform workspace new
  • Basculer entre workspaces avec terraform workspace select
  • Adapter les ressources au workspace actif avec terraform.workspace
  • Comprendre l’isolation des states entre workspaces
  • Supprimer un workspace avec terraform workspace delete

Par défaut, Terraform utilise un seul state stocké dans terraform.tfstate. Quand vous créez un workspace supplémentaire, Terraform crée un répertoire terraform.tfstate.d/ avec un sous-dossier par workspace, chacun contenant son propre state :

mon-projet/
├── main.tf
├── terraform.tfstate # state du workspace "default"
└── terraform.tfstate.d/
└── prod/
└── terraform.tfstate # state du workspace "prod"

Chaque workspace gère ses propres ressources. Déployer dans le workspace prod ne touche pas les ressources du workspace default, et inversement.

CommandeRôle
terraform workspace listLister les workspaces (* = actif)
terraform workspace showAfficher le nom du workspace actif
terraform workspace new NOMCréer un workspace et basculer dessus
terraform workspace select NOMBasculer sur un workspace existant
terraform workspace delete NOMSupprimer un workspace (doit être vide)
  1. Vérifier le workspace actif

    Par défaut, vous êtes dans le workspace default :

    Fenêtre de terminal
    terraform workspace show
    default
  2. Créer un nouveau workspace

    Fenêtre de terminal
    terraform workspace new prod
    Created and switched to workspace "prod"!
    You're now on a new, empty workspace. Workspaces isolate their state,
    so if you run "terraform plan" Terraform will not see any existing state
    for this configuration.

    Terraform crée le workspace et bascule automatiquement dessus. Le nouveau workspace a un state vide — même si des ressources existent dans default.

  3. Lister les workspaces

    Fenêtre de terminal
    terraform workspace list
    default
    * prod

    L’étoile (*) indique le workspace actif.

  4. Basculer entre workspaces

    Fenêtre de terminal
    terraform workspace select default
    Switched to workspace "default".

La variable spéciale terraform.workspace contient le nom du workspace actif. Utilisez-la dans vos configurations pour créer des ressources différentes selon l’environnement :

resource "libvirt_network" "net" {
name = "ws-${terraform.workspace}-net"
# ↑ le nom inclut le workspace : "ws-default-net" ou "ws-prod-net"
autostart = true
forward = {
mode = "nat"
}
ips = [{
address = terraform.workspace == "prod" ? "10.10.50.1" : "10.10.51.1"
# ↑ condition : prod → réseau .50, sinon → réseau .51
netmask = "255.255.255.0"
dhcp = {
ranges = [{
start = terraform.workspace == "prod" ? "10.10.50.100" : "10.10.51.100"
end = terraform.workspace == "prod" ? "10.10.50.200" : "10.10.51.200"
}]
}
}]
}
resource "libvirt_volume" "disk" {
name = "ws-${terraform.workspace}-disk.qcow2"
pool = "default"
capacity = terraform.workspace == "prod" ? 8 * 1024 * 1024 * 1024 : 4 * 1024 * 1024 * 1024
# ↑ prod → 8 Go, sinon → 4 Go
backing_store = {
path = "/chemin/vers/ubuntu-24.04-cloudimg.img"
format = { type = "qcow2" }
}
target = {
format = { type = "qcow2" }
}
}
Fenêtre de terminal
terraform workspace select default
terraform apply -auto-approve
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
disk_capacity_gb = 4
disk_name = "ws-default-disk.qcow2"
network_name = "ws-default-net"
workspace_name = "default"
Fenêtre de terminal
terraform workspace select prod
terraform apply -auto-approve
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
disk_capacity_gb = 8
disk_name = "ws-prod-disk.qcow2"
network_name = "ws-prod-net"
workspace_name = "prod"

Le même code produit des ressources avec des noms, des adresses réseau et des capacités différentes selon le workspace.

Les deux ensembles de ressources existent simultanément dans l’infrastructure :

Fenêtre de terminal
virsh net-list --all | grep ws-
ws-default-net active yes yes
ws-prod-net active yes yes
Fenêtre de terminal
virsh vol-list default | grep ws-
ws-default-disk.qcow2 /var/lib/libvirt/images/ws-default-disk.qcow2
ws-prod-disk.qcow2 /var/lib/libvirt/images/ws-prod-disk.qcow2

Chaque workspace possède ses propres ressources gérées indépendamment.

Avant de supprimer un workspace, il faut détruire ses ressources et basculer sur un autre workspace :

  1. Basculer sur le workspace à supprimer

    Fenêtre de terminal
    terraform workspace select prod
  2. Détruire les ressources

    Fenêtre de terminal
    terraform destroy -auto-approve
  3. Basculer sur un autre workspace

    Fenêtre de terminal
    terraform workspace select default
  4. Supprimer le workspace vide

    Fenêtre de terminal
    terraform workspace delete prod
    Deleted workspace "prod"!
SymptômeCause probableSolution
Workspace "default" is your active workspaceTentative de supprimer le workspace actifBasculer sur un autre workspace d’abord
Workspace is not emptyLe workspace contient encore des ressourcesterraform destroy avant de supprimer, ou -force pour passer outre (dangereux)
Ressources dupliquées dans l’infraOubli de basculer de workspace avant applyVérifier avec terraform workspace show avant chaque opération
terraform.workspace retourne defaultVous êtes dans le workspace par défautCréer un workspace avec workspace new ou basculer avec select
  • Un workspace est une copie isolée du state — pratique pour des variantes de ressources avec le même code
  • Le workspace default existe toujours et ne peut pas être supprimé
  • terraform.workspace retourne le nom du workspace actif — utilisez-le pour adapter les noms et les paramètres
  • En backend local, les states sont stockés dans terraform.tfstate.d/<nom>/terraform.tfstate (sauf default qui reste à la racine)
  • En backend distant, les workspaces partagent toujours le même backend et les mêmes credentials
  • Détruire les ressources avant de supprimer un workspace — sinon elles deviennent orphelines
  • Les workspaces sont adaptés aux tests et aux variations légères, pas à l’isolation forte d’environnements critiques

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn