In this article I will explain two different ways to pass variables values inside terraform modules. Modules let you separate your code into small units and help the engineer structure its project better.
https://www.terraform.io/language/modules/syntax
Modules in terraform (terraform files) can be placed on folders and their location should be provided on the module directive. Lets say for example that you host a main.tf on your current working directory which should call two modules. The first module would be a storage account and the second would be an app service. Your main.tf file should look like below.
module "app_service_test" { source = "./modules/appservice" } module "storage_account_test" { source = "./modules/storageaccount" }
However you want to pass some variables inside the child modules for example the resource group name, location etc.
First method – Define variables on root module
The first way you can pass variables inside your child modules would be to define a variables.tf file on your main module and a terraform.tfvars. Then you should also define a variables.tf file inside each module and contain the definition of each module.
terraform.tfvars (root module)
app_service_plan_name = "ger-plan-test" app_service_name = "ger-site-test" resource_group_name = "geralexgr-terraform-rg" resource_group_location = "West Europe" storage_account_name = "geralexgrsgv2"
variables.tf (root module)
variable "storage_account_name" { type = string description = "Storage account name" default = "" } variable "resource_group_name" { type = string description = "RG name in Azure" } variable "app_service_plan_name" { type = string description = "App Service Plan name in Azure" } variable "app_service_name" { type = string description = "Name for the app service" } variable "resource_group_location" { type = string description = "RG location in Azure" }
variables.tf (storageaccount module)
variable "storage_account_name" { type = string description = "Storage account name" } variable "resource_group_name" { type = string description = "RG name in Azure" } variable "resource_group_location" { type = string description = "RG location in Azure" }
variables.tf (appservice module)
variable "app_service_plan_name" { type = string description = "App Service Plan name in Azure" } variable "app_service_name" { type = string description = "Name for the app service" } variable "resource_group_name" { type = string description = "RG name in Azure" } variable "resource_group_location" { type = string description = "RG location in Azure" }
Then on your main module you should call your child modules as follows:
module "app_service_test" { source = "./modules/appservice" app_service_plan_name = var.app_service_plan_name app_service_name = var.app_service_name resource_group_name = var.resource_group_name resource_group_location = var.resource_group_location } module "storage_account_test" { source = "./modules/storageaccount" storage_account_name = var.storage_account_name resource_group_name = var.resource_group_name resource_group_location = var.resource_group_location }
Second method – Pass variables on module call
With this approach you do not need to have variables.tf file and terraform.tfvars file inside your root module. You only need the definition as described above inside appservice and storageaccount folders (variables.tf).
variables.tf (appservice module)
variable "app_service_plan_name" { type = string description = "App Service Plan name in Azure" } variable "app_service_name" { type = string description = "Name for the app service" } variable "resource_group_name" { type = string description = "RG name in Azure" } variable "resource_group_location" { type = string description = "RG location in Azure" }
variables.tf (storageaccount module)
variable "storage_account_name" { type = string description = "Storage account name" } variable "resource_group_name" { type = string description = "RG name in Azure" } variable "resource_group_location" { type = string description = "RG location in Azure" }
Then your main.tf file should be:
module "app_service_test" { source = "./modules/appservice" app_service_plan_name = "ger-plan-test" app_service_name = "ger-site-test" resource_group_location = "West Europe" resource_group_name = "geralexgr-terraform-rg" } module "storage_account_test" { source = "./modules/storageaccount" storage_account_name = "geralexgrsgv2" resource_group_name = "geralexgr-terraform-rg" resource_group_location = "West Europe" }