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

Exemple de 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.tf
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>

main.tf
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

Téléchargement depuis GitHub

Un module peut être téléchargé depuis une repo GitHub

Via protocole HTTPS
module "mon_module" {
    source = "github.com/etnmn/example"
}
Via protocole SSH
module "mon_module" {
    source = "git@github.com:etnmn/example.git"
}