Azure Terraform in a nutshell


Terraform by HashiCorp is an infrastructure-as-code tool. It allows infrastructure automation to be deployed via code. With Terraform, infrastructure provisioning has been simplified by using a simple, human-readable syntax.

Prerequisites

  • An active Azure subscription
  • Azure CLI
  • Visual Studio Code

Terraform Workflow

The following image depicts a Terraform provider workflow to be used to deploy your resources

It may be easier to understand the image above by assigning commands to each step.

Step / CommandAction
Init / terraform initObtains the current directory so that other commands can be run from it.
Validate / terraform validateValidates the configuration
Plan / terraform planProvides a list of changes required by the current configuration
Apply / terraform applyExecutes Terraform plans.
Destroy / terraform destroyDestroy all remote objects managed by a Terraform configuration.

How install Terraform

Below is the list of the tools required for installing Terraform provider

  • Azure CLI
  • VS Code Editor
  • Terraform plugin for VS Code
  • Git Client

Quickstart: Install and Configure Terraform

Terraform on Azure

In this section, you will read about the Terraform providers that you will be able to use to deploy and manage Azure resources.

Overview of Terraform on Azure

Terraform Providers for Azure

Azure infrastructure can be managed by several Terraform providers:

  • AzureRM: Provide help to deploy Azure resources, such as virtual machines, storage accounts, and networking interfaces.
  • Azure AD: Provide access to Azure Active Directory resources such as groups, users, service principals, and applications.
  • AzAPI : Utilize the Azure Resource Manager APIs directly to manage Azure resources and functionality. In addition to the AzureRM provider, this provider also provides the ability to manage Azure resources that aren’t yet available.
  • AzureDevops : Provide management of Azure DevOps resources, such as agents, repositories, projects, pipelines, and queries.
  • Azure Stack : Provide management of Azure Stack resources such as virtual machines, DNS, VNets, and storage.

Terraform Syntax Example

The example below shows how you can create an Azure Resource group, with an Azure VM and all related resources, i.e., VNet, PIP, Storage, etc.

terraform {

required_providers {

azurerm = {

source = “hashicorp/azurerm”

version = “3.37.0”

}

}

}

provider “azurerm” {

features {}

}

#Create a Resource Group

resource “azurerm_resource_group” “main” {

name = “res-coz-rg-westeurope”

location = “westeurope”

}

#Create a Virtual Network

resource “azurerm_virtual_network” “main” {

name = “res-coz-vnet-westeurope”

location = azurerm_resource_group.main.location

resource_group_name = azurerm_resource_group.main.name

address_space = [“10.0.0.0/21”]

}

#Create subnets

resource “azurerm_subnet” “main” {

name = “res-coz-subnet-web-westeurope”

virtual_network_name = azurerm_virtual_network.main.name

resource_group_name = azurerm_resource_group.main.name

address_prefixes = [“10.0.1.0/24”]

}

#Create network interface card (NIC)

resource “azurerm_network_interface” “internal” {

name = “res-coz-nic-int-westeurope”

location = azurerm_resource_group.main.location

resource_group_name = azurerm_resource_group.main.name

ip_configuration {

name = “internal”

subnet_id = azurerm_subnet.main.id

private_ip_address_allocation = “Dynamic”

}

}

#Create windows virtual machine

resource “azurerm_windows_virtual_machine” “main” {

name = “res-coz-vm-we”

resource_group_name = azurerm_resource_group.main.name

location = azurerm_resource_group.main.location

size = “Standard_B2s”

admin_username = “username-example”

admin_password = “############”

network_interface_ids = [

azurerm_network_interface.internal.id

]

os_disk {

caching = “ReadWrite”

storage_account_type = “Standard_LRS”

}

source_image_reference {

publisher = “MicrosoftWindowsServer”

offer = “WindowsServer”

sku = “2019-Datacenter”

version = “latest”

}

}

resource “azurerm_managed_disk” “main” {

name = “disk-westeurope”

location = azurerm_resource_group.main.location

resource_group_name = azurerm_resource_group.main.name

storage_account_type = “Standard_LRS”

create_option = “Empty”

disk_size_gb = “1024”

tags = {

environment = “staging”

}

}

Advertisement