Une expression HCL est une valeur calculée à partir d’autres valeurs. C’est elle qui permet de concaténer des chaînes, choisir une valeur selon un contexte, transformer une liste ou construire un objet sans répéter du code. Vous la retrouvez partout dans Terraform et Packer.
La difficulté ne vient pas de la syntaxe brute, mais du fait qu’on mélange souvent les expressions avec la logique métier de l’outil. Cette page reste au niveau du langage : elle vous apprend à lire les expressions HCL avant de passer aux guides Terraform ou Packer plus spécialisés.
Ce qu’est une expression HCL
Section intitulée « Ce qu’est une expression HCL »Une expression peut être très simple :
name = "vm-dev"enabled = truememory = 2048Elle peut aussi être calculée :
name = "${var.environment}-web"enabled = var.environment == "prod"Dans les deux cas, le côté droit de l’assignation est une expression.
Les références les plus fréquentes
Section intitulée « Les références les plus fréquentes »Les expressions HCL deviennent utiles dès que vous lisez des valeurs nommées. Les familles exactes dépendent de l’outil, mais les deux plus communes sont :
var.nompour une valeur d’entrée ;local.nompour une valeur calculée localement.
Exemple Terraform :
locals { vm_name = "${var.environment}-web"}Exemple Packer :
locals { full_image = "${var.base_image}:${var.image_tag}"}Opérateurs et comparaisons
Section intitulée « Opérateurs et comparaisons »Les expressions HCL utilisent les opérateurs classiques :
locals { is_prod = var.environment == "prod" has_quota = var.cpu >= 2 && var.memory >= 2048 name = "${var.project}-01"}Vous retrouvez notamment :
==et!=pour comparer ;>,>=,<,<=pour les bornes ;&&,||,!pour la logique ;+,-,*,/,%pour les calculs numériques.
Conditions ternaires
Section intitulée « Conditions ternaires »Une condition ternaire choisit une valeur selon un test booléen :
locals { instance_type = var.environment == "prod" ? "large" : "small"}Cette forme est très fréquente :
- dans Terraform pour choisir une taille, un nom, une option ou un ensemble de tags ;
- dans Packer pour activer certains paquets ou ajuster une option de build.
Templates et interpolation
Section intitulée « Templates et interpolation »Quand une expression entière est seule, vous n’avez pas besoin de ${} :
count = var.instance_countEn revanche, si vous insérez une expression dans une chaîne, l’interpolation reste pertinente :
name = "${var.project}-${var.environment}"Cette distinction évite l’un des contresens les plus courants en HCL.
Compréhensions et transformations
Section intitulée « Compréhensions et transformations »HCL permet aussi de transformer des collections avec une expression for :
locals { labels = [for package in var.packages : upper(package)]}Ou de construire une map :
locals { tags = { for key, value in var.labels : lower(key) => value }}Cette capacité est commune à Terraform et Packer. En revanche, la manière d’utiliser le résultat dépend ensuite du schéma de l’outil.
Quand passer à un guide plus spécialisé
Section intitulée « Quand passer à un guide plus spécialisé »Cette page vous donne le cadre général. Passez ensuite à un guide dédié si votre difficulté principale est :
- le typage ou les valeurs nommées : Variables et valeurs nommées HCL ;
- les fonctions intégrées : Fonctions HCL ;
- les expressions dans Terraform : Expressions Terraform ;
- les templates et builds Packer : Templates HCL2 Packer.
À retenir
Section intitulée « À retenir »- Une expression HCL est une valeur littérale ou calculée.
var.etlocal.sont les références nommées les plus communes.- Les conditions ternaires, compréhensions et interpolations sont des briques normales du langage.
- HCL fournit la syntaxe ; Terraform et Packer définissent ensuite où ces expressions sont autorisées et à quoi elles servent.