Terraform Azure RM Compute Module
Перейти к файлу
hezijie eb39fb00b2 add tracing tags toggle variable 2023-05-06 11:24:36 +08:00
.devcontainer add devcontainer 2022-12-28 09:33:07 +08:00
.github update github action files 2023-03-20 16:52:32 +08:00
examples Update TestVersionSnapshot 2023-04-30 00:23:28 +00:00
os refactor code to pass pr-check 2022-11-02 22:25:10 +08:00
test Bump github.com/Azure/terraform-module-test-helper in /test (#252) 2023-04-19 06:35:41 +08:00
unit-fixture Improve separate data disk resource logic (#233) 2023-02-09 14:17:56 +08:00
.checkov_config.yaml refactor code to pass pr-check 2022-11-02 22:25:10 +08:00
.gitignore ignore TestRecord temp file 2023-02-09 13:55:19 +08:00
.tflint_alt.hcl bump tflint azurerm plugin version 2023-02-28 09:35:29 +08:00
CHANGELOG-v3.md add CHANGELOG, update readme 2022-11-02 08:42:36 +08:00
CHANGELOG-v4.md update readme, prepare for 5.0.0 2023-01-16 15:52:10 +08:00
CHANGELOG.md Auto update 2023-04-26 08:16:10 +00:00
GNUmakefile ci, half way 2022-10-20 15:51:05 +08:00
LICENSE Initial Release (#1) 2017-09-01 21:31:56 -07:00
README.md add support for azurerm_network_interface.enable_ip_forwarding 2023-04-26 09:46:49 +08:00
SECURITY.md Microsoft mandatory file (#181) 2022-10-09 18:01:38 +08:00
locals.tf Use name template variables to customize the name of each resource (#234) 2023-02-13 17:51:02 +08:00
main.tf add support for azurerm_network_interface.enable_ip_forwarding 2023-04-26 09:46:49 +08:00
outputs.tf add support for network security group injection 2022-11-25 23:18:09 +08:00
variables.tf add tracing tags toggle variable 2023-05-06 11:24:36 +08:00
versions.tf fix #222 by upgrading Terraform required version to >= 1.3 2023-02-20 10:00:49 +08:00

README.md

terraform-azurerm-compute

Notice on new alternative virtual machine module

This module was designed and implemented for AzureRM Provider v2.x, It's impossible to refactor this module from azurerm_virtual_machine to the modern version azurerm_linux_virtual_machine and azurerm_windows_virtual_machine. For those who're maintaining infrastructure on brownfield, you're welcome to continue using this module; for those who're about to provision new infrastructure on greenfield, you're welcome to try our new alternative: terraform-azurerm-virtual-machine.

Notice on Upgrade to v5.x

As #218 described, the plan block introduced by #209 was incorrect so we must adjust the assignments' order, which is a breaking change. The change we've made to vm's plan block is:

dynamic "plan" {
  for_each = var.is_marketplace_image ? ["plan"] : []

  content {
  -      name      = var.vm_os_offer
  -      product   = var.vm_os_sku
  +      name      = var.vm_os_sku
  +      product   = var.vm_os_offer
    publisher = var.vm_os_publisher
  }
}

Now vm_os_sku would be used as plan.name and vm_os_offer would be used as plan.product.

v5.0.0 is a major version upgrade. Extreme caution must be taken during the upgrade to avoid resource replacement and downtime by accident.

Notice on Upgrade to v4.x

We've added a CI pipeline for this module to speed up our code review and to enforce a high code quality standard, if you want to contribute by submitting a pull request, please read Pre-Commit & Pr-Check & Test section, or your pull request might be rejected by CI pipeline.

A pull request will be reviewed when it has passed Pre Pull Request Check in the pipeline, and will be merged when it has passed the acceptance tests. Once the ci Pipeline failed, please read the pipeline's output, thanks for your cooperation.

v4.0.0 is a major version upgrade. Extreme caution must be taken during the upgrade to avoid resource replacement and downtime by accident.

Running the terraform plan first to inspect the plan is strongly advised.

Deploys 1+ Virtual Machines to your provided VNet

This Terraform module deploys Virtual Machines in Azure with the following characteristics:

  • Ability to specify a simple string to get the latest marketplace image using var.vm_os_simple
  • All VMs use managed disks
  • Network Security Group (NSG) created with a single remote access rule which opens var.remote_port port or auto calculated port number if using var.vm_os_simple to all nics
  • VM nics attached to a single virtual network subnet of your choice (new or existing) via var.vnet_subnet_id.
  • Control the number of Public IP addresses assigned to VMs via var.nb_public_ip. Create and attach one Public IP per VM up to the number of VMs or create NO public IPs via setting var.nb_public_ip to 0.
  • Control SKU and Allocation Method of the public IPs via var.allocation_method and var.public_ip_sku.

Note: Terraform module registry is incorrect in the number of required parameters since it only deems required based on variables with non-existent values. The actual minimum required variables depends on the configuration and is specified below in the usage.

Usage in Terraform 0.13

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

module "linuxservers" {
  source              = "Azure/compute/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  vm_os_simple        = "UbuntuServer"
  public_ip_dns       = ["linsimplevmips"] // change to a unique name per datacenter region
  vnet_subnet_id      = module.network.vnet_subnets[0]

  depends_on = [azurerm_resource_group.example]
}

module "windowsservers" {
  source              = "Azure/compute/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  is_windows_image    = true
  vm_hostname         = "mywinvm" // line can be removed if only one VM module per resource group
  admin_password      = "ComplxP@ssw0rd!"
  vm_os_simple        = "WindowsServer"
  public_ip_dns       = ["winsimplevmips"] // change to a unique name per datacenter region
  vnet_subnet_id      = module.network.vnet_subnets[0]

  depends_on = [azurerm_resource_group.example]
}

module "network" {
  source              = "Azure/network/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  subnet_prefixes     = ["10.0.1.0/24"]
  subnet_names        = ["subnet1"]

  depends_on = [azurerm_resource_group.example]
}

output "linux_vm_public_name" {
  value = module.linuxservers.public_ip_dns_name
}

output "windows_vm_public_name" {
  value = module.windowsservers.public_ip_dns_name
}

Simple Usage in Terraform 0.12

This contains the bare minimum options to be configured for the VM to be provisioned. The entire code block provisions a Windows and a Linux VM, but feel free to delete one or the other and corresponding outputs. The outputs are also not necessary to provision, but included to make it convenient to know the address to connect to the VMs after provisioning completes.

Provisions an Ubuntu Server 16.04-LTS VM and a Windows 2016 Datacenter Server VM using vm_os_simple to a new VNet and opens up ports 22 for SSH and 3389 for RDP access via the attached public IP to each VM. All resources are provisioned into the default resource group called terraform-compute. The Ubuntu Server will use the ssh key found in the default location ~/.ssh/id_rsa.pub.

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

module "linuxservers" {
  source              = "Azure/compute/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  vm_os_simple        = "UbuntuServer"
  public_ip_dns       = ["linsimplevmips"] // change to a unique name per datacenter region
  vnet_subnet_id      = module.network.vnet_subnets[0]
}

module "windowsservers" {
  source              = "Azure/compute/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  is_windows_image    = true
  vm_hostname         = "mywinvm" // line can be removed if only one VM module per resource group
  admin_password      = "ComplxP@ssw0rd!"
  vm_os_simple        = "WindowsServer"
  public_ip_dns       = ["winsimplevmips"] // change to a unique name per datacenter region
  vnet_subnet_id      = module.network.vnet_subnets[0]
}

module "network" {
  source              = "Azure/network/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  subnet_prefixes     = ["10.0.1.0/24"]
  subnet_names        = ["subnet1"]
}

output "linux_vm_public_name" {
  value = module.linuxservers.public_ip_dns_name
}

output "windows_vm_public_name" {
  value = module.windowsservers.public_ip_dns_name
}

Advanced Usage

The following example illustrates some of the configuration options available to deploy a virtual machine. Feel free to remove the Linux or Windows modules and corresponding outputs.

More specifically this provisions:

1 - New vnet for all vms

2 - Ubuntu 18.04 Server VMs using vm_os_publisher, vm_os_offer and vm_os_sku which is configured with:

  • No public IP assigned, so access can only happen through another machine on the vnet.
  • Opens up port 22 for SSH access with the default ~/.ssh/id_rsa.pub key
  • Boot diagnostics is enabled.
  • Additional tags are added to the resource group.
  • OS disk is deleted upon deletion of the VM
  • Add one 64GB premium managed data disk

2 - Windows Server 2012 R2 VMs using vm_os_publisher, vm_os_offer and vm_os_sku which is configured with:

  • Two Public IP addresses (one for each VM)
  • Public IP Addresses allocation method is Static and SKU is Standard
  • Opens up port 3389 for RDP access using the password as shown

3 - New features are supported in v3.0.0:

  • "nb_data_disk" Number of the data disks attached to each virtual machine

  • "enable_ssh_key" Enable ssh key authentication in Linux virtual Machine. When ssh keys are enabled you can either

    • use the default "~/.ssh/id_rsa.pub"
    • set one key by setting a path in ssh_key variable. e.g "joey_id_rsa.pub"
    • set ssh_key and add zero or more files paths in extra_ssh_keys variable e.g. ["ross_id_rsa.pub", "rachel_id_rsa.pub"] (since v3.8.0)
    • set ssh_key_values as a list of raw public ssh keys values or refer it to a data source with the public key value, e.g. ["ssh-rsa AAAAB3NzaC1yc..."]

4 - You can install custom certificates / secrets on the virtual machine from Key Vault by using the variable os_profile_secrets.

The variable accepts a list of maps with the following keys:

  • source_vault_id : The ID of the Key Vault Secret which contains the encrypted Certificate.
  • certificate_url : The certificate URL in Key Vault
  • certificate_store : The certificate store on the Virtual Machine where the certificate should be added to (Windows Only).

In the below example we use the data sources azurerm_key_vault and azurerm_key_vault_certificate to fetch the certificate information from Key Vault and add it to windowsservers via os_profile_secrets parameter.

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "example" {
  name     = "example-resources"
  location = "West Europe"
}

data "azurerm_key_vault" "example" {
  name                = "examplekeyvault"
  resource_group_name = azurerm_resource_group.example.name
}

data "azurerm_key_vault_certificate" "example" {
  name         = "example-kv-cert"
  key_vault_id = data.azurerm_key_vault.example.id
}

module "linuxservers" {
  source                           = "Azure/compute/azurerm"
  resource_group_name              = azurerm_resource_group.example.name
  vm_hostname                      = "mylinuxvm"
  nb_public_ip                     = 0
  remote_port                      = "22"
  nb_instances                     = 2
  vm_os_publisher                  = "Canonical"
  vm_os_offer                      = "UbuntuServer"
  vm_os_sku                        = "18.04-LTS"
  vnet_subnet_id                   = module.network.vnet_subnets[0]
  boot_diagnostics                 = true
  delete_os_disk_on_termination    = true
  nb_data_disk                     = 2
  data_disk_size_gb                = 64
  data_sa_type                     = "Premium_LRS"
  enable_ssh_key                   = true
  ssh_key_values                   = ["ssh-rsa AAAAB3NzaC1yc2EAAAAD..."]
  vm_size                          = "Standard_D4s_v3"
  delete_data_disks_on_termination = true

  tags = {
    environment = "dev"
    costcenter  = "it"
  }

  enable_accelerated_networking = true
}

module "windowsservers" {
  source                        = "Azure/compute/azurerm"
  resource_group_name           = azurerm_resource_group.example.name
  vm_hostname                   = "mywinvm"
  is_windows_image              = true
  admin_password                = "ComplxP@ssw0rd!"
  allocation_method             = "Static"
  public_ip_sku                 = "Standard"
  public_ip_dns                 = ["winterravmip", "winterravmip1"]
  nb_public_ip                  = 2
  remote_port                   = "3389"
  nb_instances                  = 2
  vm_os_publisher               = "MicrosoftWindowsServer"
  vm_os_offer                   = "WindowsServer"
  vm_os_sku                     = "2012-R2-Datacenter"
  vm_size                       = "Standard_DS2_V2"
  vnet_subnet_id                = module.network.vnet_subnets[0]
  enable_accelerated_networking = true
  license_type                  = "Windows_Client"
  identity_type                 = "SystemAssigned" // can be empty, SystemAssigned or UserAssigned

  extra_disks = [
    {
      size = 50
      name = "logs"
    },
    {
      size = 200
      name = "backup"
    }
  ]

  os_profile_secrets = [{
    source_vault_id   = data.azurerm_key_vault.example.id
    certificate_url   = data.azurerm_key_vault_certificate.example.secret_id
    certificate_store = "My"
  }]
}

module "network" {
  source              = "Azure/network/azurerm"
  resource_group_name = azurerm_resource_group.example.name
  subnet_prefixes     = ["10.0.1.0/24"]
  subnet_names        = ["subnet1"]
}

output "linux_vm_private_ips" {
  value = module.linuxservers.network_interface_private_ip
}

output "windows_vm_public_name" {
  value = module.windowsservers.public_ip_dns_name
}

output "windows_vm_public_ip" {
  value = module.windowsservers.public_ip_address
}

output "windows_vm_private_ips" {
  value = module.windowsservers.network_interface_private_ip
}

Pre-Commit & Pr-Check & Test

Configurations

We assumed that you have setup service principal's credentials in your environment variables like below:

export ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
export ARM_TENANT_ID="<azure_subscription_tenant_id>"
export ARM_CLIENT_ID="<service_principal_appid>"
export ARM_CLIENT_SECRET="<service_principal_password>"

On Windows Powershell:

$env:ARM_SUBSCRIPTION_ID="<azure_subscription_id>"
$env:ARM_TENANT_ID="<azure_subscription_tenant_id>"
$env:ARM_CLIENT_ID="<service_principal_appid>"
$env:ARM_CLIENT_SECRET="<service_principal_password>"

We provide a docker image to run the pre-commit checks and tests for you: mcr.microsoft.com/azterraform:latest

To run the pre-commit task, we can run the following command:

$ docker run --rm -v $(pwd):/src -w /src mcr.microsoft.com/azterraform:latest make pre-commit

On Windows Powershell:

$ docker run --rm -v ${pwd}:/src -w /src mcr.microsoft.com/azterraform:latest make pre-commit

NOTE: If an error occurs in Powershell that indicates Argument or block definition required for unit-fixture/locals.tf and/or unit-fixture/variables.tf, the issue could be that the symlink is not configured properly. This can be fixed as described in this link:

$ git config core.symlinks true

Then switch branches, or execute git reset:

$ git reset --hard HEAD

In pre-commit task, we will:

  1. Run terraform fmt -recursive command for your Terraform code.
  2. Run terrafmt fmt -f command for markdown files and go code files to ensure that the Terraform code embedded in these files are well formatted.
  3. Run go mod tidy and go mod vendor for test folder to ensure that all the dependencies have been synced.
  4. Run gofmt for all go code files.
  5. Run gofumpt for all go code files.
  6. Run terraform-docs on README.md file, then run markdown-table-formatter to format markdown tables in README.md.

Then we can run the pr-check task to check whether our code meets our pipeline's requirement(We strongly recommend you run the following command before you commit):

$ docker run --rm -v $(pwd):/src -w /src mcr.microsoft.com/azterraform:latest make pr-check

On Windows Powershell:

$ docker run --rm -v ${pwd}:/src -w /src mcr.microsoft.com/azterraform:latest make pr-check

To run the e2e-test, we can run the following command:

docker run --rm -v $(pwd):/src -w /src -e ARM_SUBSCRIPTION_ID -e ARM_TENANT_ID -e ARM_CLIENT_ID -e ARM_CLIENT_SECRET mcr.microsoft.com/azterraform:latest make e2e-test

On Windows Powershell:

docker run --rm -v ${pwd}:/src -w /src -e ARM_SUBSCRIPTION_ID -e ARM_TENANT_ID -e ARM_CLIENT_ID -e ARM_CLIENT_SECRET mcr.microsoft.com/azterraform:latest make e2e-test

Prerequisites

Authors

Originally created by David Tesar

License

MIT

Requirements

Name Version
terraform >= 1.3
azurerm >= 3.11, < 4.0
random >=3.0.0

Providers

Name Version
azurerm >= 3.11, < 4.0
random >=3.0.0

Modules

Name Source Version
os ./os n/a

Resources

Name Type
azurerm_availability_set.vm resource
azurerm_managed_disk.vm_data_disk resource
azurerm_managed_disk.vm_extra_disk resource
azurerm_network_interface.vm resource
azurerm_network_interface_security_group_association.test resource
azurerm_network_security_group.vm resource
azurerm_network_security_rule.vm resource
azurerm_public_ip.vm resource
azurerm_storage_account.vm_sa resource
azurerm_virtual_machine.vm_linux resource
azurerm_virtual_machine.vm_windows resource
azurerm_virtual_machine_data_disk_attachment.vm_data_disk_attachments_linux resource
azurerm_virtual_machine_data_disk_attachment.vm_data_disk_attachments_windows resource
azurerm_virtual_machine_data_disk_attachment.vm_extra_disk_attachments_linux resource
azurerm_virtual_machine_data_disk_attachment.vm_extra_disk_attachments_windows resource
azurerm_virtual_machine_extension.extension resource
azurerm_virtual_machine_extension.extensions resource
random_id.vm_sa resource
azurerm_public_ip.vm data source
azurerm_resource_group.vm data source

Inputs

Name Description Type Default Required
admin_password The admin password to be used on the VMSS that will be deployed. The password must meet the complexity requirements of Azure. string "" no
admin_username The admin username of the VM that will be deployed. string "azureuser" no
allocation_method Defines how an IP address is assigned. Options are Static or Dynamic. string "Dynamic" no
as_platform_fault_domain_count (Optional) Specifies the number of fault domains that are used. Defaults to 2. Changing this forces a new resource to be created. number 2 no
as_platform_update_domain_count (Optional) Specifies the number of update domains that are used. Defaults to 2. Changing this forces a new resource to be created. number 2 no
availability_set_enabled (Optional) Enable or Disable availability set. Default is true (enabled). bool true no
boot_diagnostics (Optional) Enable or Disable boot diagnostics. bool false no
boot_diagnostics_sa_type (Optional) Storage account type for boot diagnostics. string "Standard_LRS" no
custom_data The custom data to supply to the machine. This can be used as a cloud-init for Linux systems. string "" no
data_disk_size_gb Storage data disk size size. number 30 no
data_sa_type Data Disk Storage Account type. string "Standard_LRS" no
delete_data_disks_on_termination Delete data disks when machine is terminated. bool false no
delete_os_disk_on_termination Delete OS disk when machine is terminated. bool false no
enable_accelerated_networking (Optional) Enable accelerated networking on Network interface. bool false no
enable_ip_forwarding (Optional) Should IP Forwarding be enabled? Defaults to false. bool false no
enable_ssh_key (Optional) Enable ssh key authentication in Linux virtual Machine. bool true no
external_boot_diagnostics_storage (Optional) The Storage Account's Blob Endpoint which should hold the virtual machine's diagnostic files. Set this argument would disable the creation of azurerm_storage_account resource.
object({
uri = string
})
null no
extra_disks (Optional) List of extra data disks attached to each virtual machine.
list(object({
name = string
size = number
}))
[] no
extra_ssh_keys Same as ssh_key, but allows for setting multiple public keys. Set your first key in ssh_key, and the extras here. list(string) [] no
identity_ids Specifies a list of user managed identity ids to be assigned to the VM. list(string) [] no
identity_type The Managed Service Identity Type of this Virtual Machine. string "" no
is_marketplace_image Boolean flag to notify when the image comes from the marketplace. bool false no
is_windows_image Boolean flag to notify when the custom image is windows based. bool false no
license_type Specifies the BYOL Type for this Virtual Machine. This is only applicable to Windows Virtual Machines. Possible values are Windows_Client and Windows_Server string null no
location (Optional) The location in which the resources will be created. string null no
managed_data_disk_encryption_set_id (Optional) The disk encryption set ID for the managed data disk attached using the azurerm_virtual_machine_data_disk_attachment resource. string null no
name_template_availability_set The name template for the availability set. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname. All other text can be set as desired. string "${vm_hostname}-avset" no
name_template_data_disk The name template for the data disks. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index', ${data_disk_number} => 'data disk index'. All other text can be set as desired. string "${vm_hostname}-datadisk-${host_number}-${data_disk_number}" no
name_template_extra_disk The name template for the extra disks. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index', ${extra_disk_name} => 'name of extra disk'. All other text can be set as desired. string "${vm_hostname}-extradisk-${host_number}-${extra_disk_name}" no
name_template_network_interface The name template for the network interface. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index'. All other text can be set as desired. string "${vm_hostname}-nic-${host_number}" no
name_template_network_security_group The name template for the network security group. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname. All other text can be set as desired. string "${vm_hostname}-nsg" no
name_template_public_ip The name template for the public ip. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${ip_number} => 'public ip index'. All other text can be set as desired. string "${vm_hostname}-pip-${ip_number}" no
name_template_vm_linux The name template for the Linux virtual machine. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index'. All other text can be set as desired. string "${vm_hostname}-vmLinux-${host_number}" no
name_template_vm_linux_os_disk The name template for the Linux VM OS disk. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index'. All other text can be set as desired. string "osdisk-${vm_hostname}-${host_number}" no
name_template_vm_windows The name template for the Windows virtual machine. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index'. All other text can be set as desired. string "${vm_hostname}-vmWindows-${host_number}" no
name_template_vm_windows_os_disk The name template for the Windows VM OS disk. The following replacements are automatically made: ${vm_hostname} => var.vm_hostname, ${host_number} => 'host index'. All other text can be set as desired. string "${vm_hostname}-osdisk-${host_number}" no
nb_data_disk (Optional) Number of the data disks attached to each virtual machine. number 0 no
nb_instances Specify the number of vm instances. number 1 no
nb_public_ip Number of public IPs to assign corresponding to one IP per vm. Set to 0 to not assign any public IP addresses. number 1 no
nested_data_disks (Optional) When true, use nested data disks directly attached to the VM. When false, use azurerm_virtual_machine_data_disk_attachment resource to attach the data disks after the VM is created. Default is true. bool true no
network_security_group The network security group we'd like to bind with virtual machine. Set this variable will disable the creation of azurerm_network_security_group and azurerm_network_security_rule resources.
object({
id = string
})
null no
os_profile_secrets Specifies a list of certificates to be installed on the VM, each list item is a map with the keys source_vault_id, certificate_url and certificate_store. list(map(string)) [] no
public_ip_dns Optional globally unique per datacenter region domain name label to apply to each public ip address. e.g. thisvar.varlocation.cloudapp.azure.com where you specify only thisvar here. This is an array of names which will pair up sequentially to the number of public ips defined in var.nb_public_ip. One name or empty string is required for every public ip. If no public ip is desired, then set this to an array with a single empty string. list(string)
[
null
]
no
public_ip_sku Defines the SKU of the Public IP. Accepted values are Basic and Standard. Defaults to Basic. string "Basic" no
remote_port Remote tcp port to be used for access to the vms created via the nsg applied to the nics. string "" no
resource_group_name The name of the resource group in which the resources will be created. string n/a yes
source_address_prefixes (Optional) List of source address prefixes allowed to access var.remote_port. list(string)
[
"0.0.0.0/0"
]
no
ssh_key Path to the public key to be used for ssh access to the VM. Only used with non-Windows vms and can be left as-is even if using Windows vms. If specifying a path to a certification on a Windows machine to provision a linux vm use the / in the path versus backslash.e.g. c : /home/id_rsa.pub. string "~/.ssh/id_rsa.pub" no
ssh_key_values List of Public SSH Keys values to be used for ssh access to the VMs. list(string) [] no
storage_account_type Defines the type of storage account to be created. Valid options are Standard_LRS, Standard_ZRS, Standard_GRS, Standard_RAGRS, Premium_LRS. string "Premium_LRS" no
storage_os_disk_size_gb (Optional) Specifies the size of the data disk in gigabytes. number null no
tags A map of the tags to use on the resources that are deployed with this module. map(string)
{
"source": "terraform"
}
no
vm_extension (Deprecated) This variable has been superseded by the vm_extensions. Argument to create azurerm_virtual_machine_extension resource, the argument descriptions could be found at the document.
object({
name = string
publisher = string
type = string
type_handler_version = string
auto_upgrade_minor_version = optional(bool)
automatic_upgrade_enabled = optional(bool)
failure_suppression_enabled = optional(bool, false)
settings = optional(string)
protected_settings = optional(string)
protected_settings_from_key_vault = optional(object({
secret_url = string
source_vault_id = string
}))
})
null no
vm_extensions Argument to create azurerm_virtual_machine_extension resource, the argument descriptions could be found at the document.
set(object({
name = string
publisher = string
type = string
type_handler_version = string
auto_upgrade_minor_version = optional(bool)
automatic_upgrade_enabled = optional(bool)
failure_suppression_enabled = optional(bool, false)
settings = optional(string)
protected_settings = optional(string)
protected_settings_from_key_vault = optional(object({
secret_url = string
source_vault_id = string
}))
}))
[] no
vm_hostname local name of the Virtual Machine. string "myvm" no
vm_os_id The resource ID of the image that you want to deploy if you are using a custom image.Note, need to provide is_windows_image = true for windows custom images. string "" no
vm_os_offer The name of the offer of the image that you want to deploy. This is ignored when vm_os_id or vm_os_simple are provided. string "" no
vm_os_publisher The name of the publisher of the image that you want to deploy. This is ignored when vm_os_id or vm_os_simple are provided. string "" no
vm_os_simple Specify UbuntuServer, WindowsServer, RHEL, openSUSE-Leap, CentOS, Debian, CoreOS and SLES to get the latest image version of the specified os. Do not provide this value if a custom value is used for vm_os_publisher, vm_os_offer, and vm_os_sku. string "" no
vm_os_sku The sku of the image that you want to deploy. This is ignored when vm_os_id or vm_os_simple are provided. string "" no
vm_os_version The version of the image that you want to deploy. This is ignored when vm_os_id or vm_os_simple are provided. string "latest" no
vm_size Specifies the size of the virtual machine. string "Standard_D2s_v3" no
vnet_subnet_id The subnet id of the virtual network where the virtual machines will reside. string n/a yes
zone (Optional) The Availability Zone which the Virtual Machine should be allocated in, only one zone would be accepted. If set then this module won't create azurerm_availability_set resource. Changing this forces a new resource to be created. string null no

Outputs

Name Description
availability_set_id Id of the availability set where the vms are provisioned. If var.zones is set, this output will return empty string.
network_interface_ids ids of the vm nics provisoned.
network_interface_private_ip private ip addresses of the vm nics
network_security_group_id id of the security group provisioned
network_security_group_name name of the security group provisioned, empty if no security group was created.
public_ip_address The actual ip address allocated for the resource.
public_ip_dns_name fqdn to connect to the first vm provisioned.
public_ip_id id of the public ip address provisoned.
vm_identity map with key Virtual Machine Id, value list of identity created for the Virtual Machine.
vm_ids Virtual machine ids created.
vm_names Virtual machine names created.
vm_zones map with key Virtual Machine Id, value list of the Availability Zone which the Virtual Machine should be allocated in.