Terraform 0.12 – Module for creating Azure virtual machine

Posted: January 27, 2020 in Azure

Create terraform application and get SubcriptionID,TenantID,ApplicationID,Client Secret and Object ID as described in this post.

Add Azure client ID,Client Secret, subscription ID and environmental variables

For linux:

export ARM_CLIENT_ID=key
export ARM_CLIENT_SECRET=key
export ARM_SUBSCRIPTOIN=key
export ARM_TENANT_ID=key

Download files from here

Open \module\vm\example\terraform.tfvars and add azure_application_id and azure_tenant_id

azure_application_id = "your Object ID"
azure_tenant_id="Your tenant ID"

Edit C:\terraform\modules\vm\example\main.tf

There are 4 modules:

  • azure_vnet: creates Virtual network (10.0.0.0/16) and 1 subnet (10.0.1.0/24), output is subnet name
  • azure_key_vault:creates Azure vault, key and secret, it outputs vault URL,vault ID, key name, key version and secret ID
  • azure_vm: creates Azure VM, there is option to chose OS (linux/windows), whether OS disk will be encrypted, number of VM’s, it adds one data disk and arbitrary number of managed disks
  • azure_rg: creates resource group for all above resources

 

#Resource group


module "rg" {
#  C:\terraform\modules\rg in my case
source = "./../../rg"
resource_group_name = var.resource_group_name
resource_group_location=var.resource_group_location
}


# module VNET (creates Virtual network and one subnet)

module "azure_vnet" {
environment_name=var.environment_name

# C:\terraform\modules\vnet in my example

source = "./../../vnet"
address_space = ["10.0.0.0/16"] 
subnet_prefix = "10.0.1.0/24"
resource_group_name = module.rg.resource_group_name
resource_group_location=module.rg.resource_group_location
}

# Creates Key Vault key and key vault secret
module "azure_key_vault" {

# C:\terraform\modules\vault in my example

source = "./../../vault"
environment_name = var.environment_name
resource_group_name = module.rg.resource_group_name
resource_group_location=module.rg.resource_group_location
azure_application_id = var.azure_application_id
azure_tenant_id = var.azure_tenant_id
key_vault_name = var.key_vault_name
# your public IP
network_acl = ["1.2.3.4/32"]
}

# Creates VM, this modules uses output of azure_vnet module to get Key vault ID, vault URL,
# key, key version and secret.
# It uses output of azure_vnet module to get VNET subnet ID 

module "azure_vm" {

# C:\terraform\modules\vm in my example
# creates Linux VM
source = "./../../vm"
environment_name=var.environment_name
key_vault_url = module.azure_key_vault.key_vault_url
key_vault_resource_id = module.azure_key_vault.key_vault_resource_id
key_encryption_key_name = module.azure_key_vault.key_encryption_key_name
key_encryption_key_version = module.azure_key_vault.key_encryption_key_version
key_vault_secret_id = module.azure_key_vault.key_vault_secret_id
subnet_id = module.azure_vnet.vnet_subnet_production_id
resource_group_name = module.rg.resource_group_name
resource_group_location=module.rg.resource_group_location
os = "linux"
vm_size = "Standard_B2ms"
vm_image_publisher = "OpenLogic"
vm_image_offer = "Centos"
vm_image_sku = "7.6"
vm_name = "myvm"
vm_admin = "ja"
vm_password = var.vm_password
ssh_public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQKYqy2uedBIBlGY4xe2/tE9wszzIrWDe1eyqxHByjl root@localhost"
number_of_machines = "2"
# disk size in GB
disk_size = "2"
number_of_managed_disks = 2
# encrypt OS disk
encryption = true
}


module "azure_vm1" {

# C:\terraform\modules\vm in my example
# creates Windows VM
source = "./../../vm"
environment_name=var.environment_name
key_vault_url = module.azure_key_vault.key_vault_url
key_vault_resource_id = module.azure_key_vault.key_vault_resource_id
key_encryption_key_name = module.azure_key_vault.key_encryption_key_name
key_encryption_key_version = module.azure_key_vault.key_encryption_key_version
key_vault_secret_id = module.azure_key_vault.key_vault_secret_id
subnet_id = module.azure_vnet.vnet_subnet_production_id
resource_group_name = module.rg.resource_group_name
resource_group_location=module.rg.resource_group_location
os = "windows"
vm_size = "Standard_B2ms"
vm_image_publisher = "MicrosoftWindowsServer"
vm_image_offer = "WindowsServer"
vm_image_sku = "2016-Datacenter"
vm_name = "myvm2"
vm_admin = "ja"
vm_password = "Passw0rd01234!"
number_of_machines = "1"
disk_size = "2"
number_of_managed_disks = 0
encryption = false
}


Usage:

cd C:\terraform\modules\vm\example
terraform init && terraform apply
Advertisement

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s