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"
}