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

Outputs Terraform : exposer les valeurs après apply

8 min de lecture

logo terraform

Votre terraform apply s’est terminé : la VM est créée. Mais quelle est son adresse IP ? Quel est le chemin du disque ? Comment transmettre ces valeurs à un script Ansible qui doit s’exécuter juste après ?

Les outputs sont le mécanisme de Terraform pour exposer les valeurs après l’apply. Un bloc output {} définit ce qui est affiché en fin d’apply, récupérable avec terraform output, et transmissible à d’autres modules via module.nom.output. Sans outputs, les valeurs créées par Terraform restent enfouies dans le state — inaccessibles aux outils avals. terraform output -json permet d’intégrer ces valeurs dans des pipelines CI/CD ou des scripts shell. Les outputs sensibles (mots de passe, tokens) sont masqués dans les logs mais restent accessibles de façon programmatique.

  • Déclarer un output : bloc output {}, value, description
  • Afficher les outputs : terraform output après apply
  • Formater en JSON : terraform output -json pour les scripts
  • Outputs sensibles : masquer les secrets dans l’affichage
  • Outputs et modules : passer des valeurs entre modules avec module.nom.output

Pensez à une fonction qui retourne une valeur :

def create_vm(name, memory):
vm_id = api_call.create(...)
return vm_id # ← Expose une valeur
# Ailleurs
vm_id = create_vm("prod-vm", 2048)
use_this_vm(vm_id)

Sans return, vous n’avez aucune façon de récupérer vm_id. Les outputs Terraform font exactement cela : ils exposent les valeurs créées par vos ressources pour qu’elles soient utilisables par d’autres outils ou modules.

Placez vos outputs dans outputs.tf :

outputs.tf
output "vm_name" {
description = "Nom de la VM créée"
value = libvirt_domain.vm.name
}
output "vm_memory" {
description = "RAM allouée en MiB"
value = libvirt_domain.vm.memory
}
output "disk_path" {
description = "Chemin du disque qcow2 sur l'hôte"
value = libvirt_volume.disk.path
}
output "vm_label" {
description = "Label combiné pool / vm_name via locals"
value = local.vm_label
}

Attributs d’un bloc output :

AttributRôleObligatoire
valueExpression à exposer (resource.attribut, var.*, local.*)Oui
descriptionDocumenter l’outputNon, mais recommandé
sensitiveMasquer dans l’affichageNon

Après terraform apply, les outputs apparaissent directement :

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
disk_path = "/var/lib/libvirt/images/lab02-vm.qcow2"
vm_label = "lab02/lab02-vm"
vm_memory = 512
vm_name = "lab02-vm"

Pour les relire à tout moment sans relancer un apply :

Fenêtre de terminal
terraform output

Résultat :

disk_path = "/var/lib/libvirt/images/lab02-vm.qcow2"
vm_label = "lab02/lab02-vm"
vm_memory = 512
vm_name = "lab02-vm"

Pour un seul output :

Fenêtre de terminal
terraform output vm_name
# "lab02-vm"

Le format JSON (-json) facilite l’intégration dans les pipelines CI/CD :

Fenêtre de terminal
terraform output -json
{
"disk_path": {
"sensitive": false,
"type": "string",
"value": "/var/lib/libvirt/images/lab02-vm.qcow2"
},
"vm_label": {
"sensitive": false,
"type": "string",
"value": "lab02/lab02-vm"
},
"vm_memory": {
"sensitive": false,
"type": "number",
"value": 512
},
"vm_name": {
"sensitive": false,
"type": "string",
"value": "lab02-vm"
}
}

Extraire une valeur avec jq :

Fenêtre de terminal
VM=$(terraform output -json | jq -r '.vm_name.value')
echo "VM créée : $VM"
# VM créée : lab02-vm

Ou directement :

Fenêtre de terminal
VM=$(terraform output -raw vm_name)
echo "VM créée : $VM"

-raw renvoie la valeur brute (sans guillemets), utile pour les assignations shell.

Pour masquer un output dans tous les affichages :

output "db_password" {
description = "Mot de passe de la base"
value = random_password.db.result
sensitive = true
}

L’affichage montre :

db_password = <sensitive>

Le -json l’indique aussi, mais sans masquer la valeur :

{
"db_password": {
"sensitive": true,
"type": "string",
"value": "motdepasse-demo"
}
}

Quand vous utilisez un module, ses outputs deviennent accessibles avec module.nom_du_module.nom_output :

module/vm/outputs.tf
output "ip_address" {
value = libvirt_domain.vm.network_interface[0].addresses[0]
}
# root module : main.tf
module "web" {
source = "./modules/vm"
# ...
}
module "monitoring" {
source = "./modules/monitoring"
target_ip = module.web.ip_address
}
  • Passer une valeur à une variable du même module : utilisez locals pour ça (locals Terraform)
  • Déclencher une action : un output est passif, il ne fait qu’exposer
  • Référencer un output d’un autre fichier du même module : tous les fichiers .tf partagent le même namespace, pas besoin d’outputs internes
  1. output {} dans outputs.tf expose une valeur après apply
  2. terraform output relit les outputs depuis le state sans apply
  3. terraform output -json et -raw facilitent l’intégration dans les scripts
  4. sensitive = true masque l’affichage mais pas le state
  5. Entre modules, on accède aux outputs via module.nom.output

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