Variables dans Terraform
Documentation officielle : https://developer.hashicorp.com/terraform/language/values
Lors de l'exécution, Terraform lit tous les fichiers *.tf et *.tfvars présents dans le répertoire de travail. Les variables ne devraient pas être définies dans un seul fichier, mais réparties dans différents fichiers selon leur catégorie.
- Gestion centralisée des variables via le fichier variables.tf
- Déclaration du nom, type, valeur par défaut et autres caractéristiques avec le mot-clé variable
- Les variables au sein d'un même module doivent être uniques
- Possibilité de lecture à partir de variables d'environnement ou de fichiers texte
- Exportation des valeurs des variables sensibles dans les variables d'environnement (préfixées par TF_VAR_)
- Définition des valeurs des variables dans le fichier terraform.tfvars, lu par défaut par Terraform
Paramètres optionnels pour la déclaration de variables
- default : valeur par défaut de la variable
- type : type de la variable
- description : description de la variable
- validation : règles de validation pour la varible
- sensitive : limite l'affichage de la variable dans le termianl (true pour masquer)
- nullable : indique si la variable peut être nulle
Types de variables courants
- any
- string, number, bool
- list(), set(), map()
- object((ATTR_NAME = ATTR_TYPE, ...)), tuple([,...])
Par exemple : utilisation d'une variable de type map pour définir des noms de domaine DNS. La variable est déclarée de type map dans variables.tf, ses valeurs sont définies dans terraform.tfvars, et les valeurs sont appelées dans les ressources via l'indexation du type de données map.
Méthodes d'utilisation des variables
Après déclaration, les variables peuvent être référencées via var.NOM_VARIABLE ; NOM_VARIANT étant le nom défini dans variables.tf.
Les priorités d'attribution des valeurs sont les suivantes :
- Variables d'environnement, Terraform lit les variables d'environnement au format TF_VAR_nom
- terraform.tfvars | terraform.tfvars.json
- *.auto.tfvars | *.auto.tfvars.json
- Ligne de commande, via l'option -var pour passer des variables ou -var-file pour charger un fichier de variables
Terraform charge automatiquement les fichiers avec l'extension .tfvars et .auto.tfvars du répertoire courant pour remplir les variables définies. Pour les fichiers d'autres formats, l'option -var-file permet de spécifier manuellement le fichier de valeurs de variables au format HCL ou JSON.
terraform apply -var="region=fr-paris"
terraform apply -var='env_list=["dev", "test"]' -var="region=fr-paris"
terraform apply -var-file="dev.tfvars"
export TF_VAR_region='fr-paris'
export TF_VAR_env_list='["dev", "test"]'
Exemple : Terraform lira la variable d'environnement TF_VAR_access_key et l'utilisera pour remplir la variable access_key.
Variables locales
- Les valeurs locales aident à éviter la répétition des mêmes valeurs ou expressions dans la configuration
- Principalement utilisées pour le débogage et les tests
- Définies avec le mot-clé locals, appelées via local.NOM_VARIABLE
Entrée interactive
Si aucune valeur n'est attribuée à une variable, Terraform affichera une interface interactive demandant à l'utilisateur de saisir manuellement les valeurs des variables.
Valeurs de sortie (Output)
- Permettent d'afficher des variables définies ou de rendre des informations disponibles pour d'autres configurations Terraform
- Les valeurs de sortie sont similaires aux valeurs de retour dans les langages de programmation
Paramètres optionnels pour les outputs
- description : description de la variable
- sensitive : limite l'affichage dans l'interface utilisateur
- depends_on : dépendances
Exemple
Fichier variables.tf
variable "environnement" {
type = list(string)
description = "Définition des noms d'environnement"
default = ["dev"]
}
variable "enregistres_dns" {
type = map(string)
description = "Définition des enregistrements DNS"
}
variable "configuration_ecs" {
type = object({
image_ecs = string,
nom_ecs = string
})
description = "Définition de la configuration ECS"
}
locals {
variable_locale1 = "test local 1"
variable_locale2 = "test local 2"
}
Fichier terraform.tfvars
environnement = ["dev", "test", "preprod", "production"]
enregistres_dns = {
"dev" = "dev.exemple.fr",
"test" = "test.exemple.fr",
"preprod" = "preprod.exemple.fr",
"production" = "production.exemple.fr"
}
configuration_ecs = {
image_ecs = "ubuntu_20_04"
nom_ecs = "mon_ecs_exemple"
}
Fichier output.tf
output "message" {
value = "Ceci est un test"
}
output "environnement_actuel" {
value = var.environnement[2]
sensitive = true
description = "Nom de l'environnement"
}
output "dns_preprod" {
value = var.enregistres_dns["preprod"]
}
output "nom_ecs" {
value = var.configuration_ecs["nom_ecs"]
}
output "variable_locale" {
value = local.variable_locale1
}