Les fonctions HCL servent à transformer des valeurs sans alourdir votre code. C’est elles qui vous évitent de concaténer à la main, de reconstruire des maps laborieusement, ou de multiplier des conditions peu lisibles. Elles sont très présentes dans Terraform et Packer.
Le plus important n’est pas de mémoriser toute la référence, mais de reconnaître quelques grandes familles de fonctions et les problèmes qu’elles résolvent.
Les fonctions de chaînes
Section intitulée « Les fonctions de chaînes »Ces fonctions servent à nettoyer, composer ou formater du texte :
locals { slug = replace(lower(var.project), " ", "-") short_name = substr(var.project, 0, 8) display = format("%s-%s", var.project, var.environment)}Retenez notamment :
lower()etupper();replace();substr();format();split()etjoin().
Les fonctions de collections
Section intitulée « Les fonctions de collections »Elles servent à manipuler listes, sets, maps et objets :
locals { names = distinct(var.names) all_names = concat(["bootstrap"], local.names) config = merge(var.default_tags, var.extra_tags) has_admin = contains(var.roles, "admin")}Les plus fréquentes sont souvent :
length();contains();concat();distinct();merge();keys()etvalues();lookup().
Les fonctions de conversion et de robustesse
Section intitulée « Les fonctions de conversion et de robustesse »Certaines fonctions sont utiles pour garder un code plus robuste :
locals { enabled_text = tostring(var.enabled) safe_port = try(var.service.port, 8080) valid_name = can(regex("^[a-z0-9-]+$", var.project))}Trois fonctions valent l’effort d’être retenues tôt :
tostring(),tonumber(),tolist()et autres conversions ;try()pour prévoir un repli ;can()pour tester si une expression s’évalue sans erreur.
Fonctions et HCL dans Terraform comme dans Packer
Section intitulée « Fonctions et HCL dans Terraform comme dans Packer »La logique générale est commune aux deux outils. Exemples :
- dans Terraform, vous utiliserez souvent ces fonctions pour construire des tags, des noms de ressources, des valeurs d’outputs ou des locals ;
- dans Packer, vous les utiliserez pour préparer une image, générer des labels, composer un identifiant de build ou sélectionner des paquets.
Exemple Packer :
locals { image_name = format("%s-%s", var.project, var.environment) packages = var.environment == "prod" ? ["curl", "ca-certificates"] : ["curl", "jq", "vim"]}Exemple Terraform :
locals { vm_name = format("%s-%s", var.project, var.environment) tags = merge(var.default_tags, { Name = local.vm_name })}Fonctions et versions d’outils
Section intitulée « Fonctions et versions d’outils »Même si Terraform et Packer partagent une grande partie de l’écosystème HCL, toutes les fonctions ne sont pas forcément disponibles de manière identique dans toutes les versions. Si vous travaillez sur un projet ancien, vérifiez toujours la version de l’outil avant d’utiliser une fonction récente.
À retenir
Section intitulée « À retenir »- Les fonctions HCL évitent le code répétitif et rendent les expressions lisibles.
- Commencez par les familles chaînes, collections et robustesse.
format(),merge(),contains(),length(),lookup(),try()etcan()couvrent déjà beaucoup de cas réels.- Terraform et Packer partagent largement cette logique, même si les usages concrets diffèrent.