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
