Les modules
Les modules Terraform sont des abstractions autonomes de la configuration, permettant d’organiser son code et de le réutiliser. Un module est une collection de fichiers .tf
, rassemblés dans un même répertoire. Toutes les configurations disposent d’au moins un module, appelé root et constitué des fichiers .tf
présents dans le répertoire principal. Les modules peuvent peuvent appeler des modules enfants, afin d’inclure leurs ressources dans la configuration. Les modules enfants peuvent être appelés plusieurs fois dans une même configuration et plusieurs configurations peuvent appeler les mêmes modules.
Les modules peuvent être chargés depuis les fichiers locaux, mais également depuis un registry privé ou public.
Structure d’un module
📒 my-module 📄 LICENSE 📄 README.md 📄 main.tf 📄 variables.tf 📄 outputs.tf
Il est possible de créer un module avec seulement un seul fichier .tf
mais il est important de ne pas distribuer les fichiers suivants :
-
terraform.tfstate
,terraform.tfstate.backup
: state terraform -
.terraform
: contient les plugins -
*.tfvars
: variables
Outputs
Les Outputs sont les variables de sortie d’un module. Elles ont plusieurs cas d’utilisations :
-
Un module enfant peut utiliser les outputs pour exposer des attributs de ses ressources à son module parent
-
Le module racine peut utiliser les outputs pour afficher des informations dans la CLI, à l’issue du
terraform apply
-
Dans le cas des dépôts distants, une configuration peut accéder aux outputs d’un module root d’une autre configuration via le data source
terraform_remote_state
. Il est ainsi possible de partager de l’information entre les configurations.
Pour définir une variable de sortie, on utilise le mot clé output
:
output "azurerm_storage_account_name" {
value = azurerm_storage_account.storage-blob.name (1)
description = "The Azure Blob storage account name."
}
1 | Le nom du storage account est exposé via la variable azurerm_storage_account_name |
Pour faire référence à un variable de sortie, il faut utiliser la syntaxe: module.<nom-du-module>.<nom-output>
module "application" {
source = "./modules/app-service"
resource_group = azurerm_resource_group.main.name
application_name = var.application_name
environment = local.environment
location = var.location
azure_storage_account_name = module.storage-blob.azurerm_storage_account_name (1)
}
module "storage-blob" { (2)
source = "./modules/storage-blob" (3)
resource_group = azurerm_resource_group.main.name
application_name = var.application_name
environment = local.environment
location = var.location
}
1 | Nom du module cible |
2 | Chemin relatif du module |
3 | Récupération de la valeur de la variable de sortie |