This article is part of the series on using Terraform in Azure and after explaining how to get started with Terraform in Azure, I will share my experience with using Terraform to provision your infrastructure for several environments.
Indeed, in a DevOps process in which your application will be deployed on several environments (example Dev - Test - QA - Production), it is the same for the infrastructure.
In Terraform there are several concepts that allow you to provision our infrastructure on multiple environments by having a maintainable code.
Among these concepts there are 2 that I will share to you, that are usage of:
- Variables
- Remotes backends for tfstates in Azure Storage
In this article I expose my usage of variables, the Remote backends will be exposed on the next.
Variables in Terraform have a very important role, they will allow you to optimize your code without having to duplicate it and thus improve its maintainability and visibility by having a common code for all environments and just variables for differences in names, properties,….
Using a variable is very simple: In your .tf file
1- Declaring your variables
variable "resource_group" {
description = "The name of the resource group in which to create the virtual network."
default = "rg_hol_terraform"
}
variable "location" {
description = "The location/region where the virtual network is created. Changing this forces a new resource to be created."
default = "West Europe"
}
2. Reference these variables
resource "azurerm_resource_group" "rg" {
name = "${var.resource_group}"
location = "${var.location}"
tags {
environment = "Terraform in Azure"
}
}
3. Instantiate these values
resource_group = "hol-terraform"
location="West Europe"
The complete sample is in my GitHub
That is the basis usage of variables in Terraform and you can read the official doc.
Organize the code for multiple environments
In the real project that it’s deployed in multiple environments (or stages) we need to organize the code with:
- the same Azure resources code for all environments
- use variables for parameter your environments properties
Below, a sample of my folder organization
project
│ main.tf --> code that provisioning your resources
| variables.tf --> your variables declaration
└───dev
│ │ env.tfvars --> specific value of variable of the DEV env
└───production
│ env.tfvars --> specific value of variable of the PRODUCTION env
└───global_vars
│ global.tfvars --> common value of variables for all env
Each env.tfvars contains specific environment value, for example:
For dev
resource_group = "hol-terraform-dev"
For production
resource_group = "hol-terraform-prod"
The global.tfvars contain all common values for all environments
location="West Europe"
I intentionally use the same file names, in order to simplify the automatic execution of Terraform in the DevOps process (which we will see in future article).
Terraform execution with this model
At finally I will plan/apply my Terraform.
At the root of my project folder I run the command:
For deploy to dev
terraform plan -var-file="dev/env.tfvars" -var-file="global_vars/global.tfvars"
For deploy to production
terraform plan -var-file="production/env.tfvars" -var-file="global_vars/global.tfvars"
For all environments it will be the main.tf that will be executed and therefore it will be the same resources that will be created.
What Next
In this post, we saw how to use variables to optimize the terrafom code that will deploy an infra on several environments. In the next article, I will show you how I use backends remotes in Azure storage account to manage tfstates of all my environments.
Comments