Skip to content

compute/virtual_machine

Overview

This page documents the Terraform module implementation, key configuration surfaces, and how it integrates with CAF.

Dependency diagram (Mermaid)

graph TD azurecaf_name.legacy["azurecaf_name.legacy"] azurecaf_name.legacy_computer_name["azurecaf_name.legacy_computer_name"] azurecaf_name.nic["azurecaf_name.nic"] azurerm_backup_protected_vm.backup["azurerm_backup_protected_vm.backup"] azurerm_dev_test_global_vm_shutdown_schedule.enabled["azurerm_dev_test_global_vm_shutdown_schedule.enabled"] azurerm_key_vault_certificate.self_signed_winrm["azurerm_key_vault_certificate.self_signed_winrm"] azurerm_key_vault_secret.admin_password["azurerm_key_vault_secret.admin_password"] azurerm_key_vault_secret.backup_encryption_password["azurerm_key_vault_secret.backup_encryption_password"] azurerm_key_vault_secret.sql_admin_password["azurerm_key_vault_secret.sql_admin_password"] azurerm_key_vault_secret.ssh_private_key["azurerm_key_vault_secret.ssh_private_key"] azurerm_key_vault_secret.ssh_public_key_openssh["azurerm_key_vault_secret.ssh_public_key_openssh"] azurerm_linux_virtual_machine.vm["azurerm_linux_virtual_machine.vm"] azurerm_managed_disk.disk["azurerm_managed_disk.disk"] azurerm_mssql_virtual_machine.mssqlvm["azurerm_mssql_virtual_machine.mssqlvm"] azurerm_network_interface.nic["azurerm_network_interface.nic"] azurerm_network_interface_application_security_group_association.assoc["azurerm_network_interface_application_security_group_association.assoc"] azurerm_network_interface_security_group_association.nic["azurerm_network_interface_security_group_association.nic"] azurerm_network_interface_security_group_association.nic_nsg["azurerm_network_interface_security_group_association.nic_nsg"] azurerm_virtual_machine.vm["azurerm_virtual_machine.vm"] azurerm_virtual_machine_data_disk_attachment.disk["azurerm_virtual_machine_data_disk_attachment.disk"] azurerm_windows_virtual_machine.vm["azurerm_windows_virtual_machine.vm"] data.azurecaf_name.disk["data.azurecaf_name.disk"] data.azurecaf_name.linux["data.azurecaf_name.linux"] data.azurecaf_name.linux_computer_name["data.azurecaf_name.linux_computer_name"] data.azurecaf_name.os_disk_linux["data.azurecaf_name.os_disk_linux"] data.azurecaf_name.os_disk_windows["data.azurecaf_name.os_disk_windows"] data.azurecaf_name.windows["data.azurecaf_name.windows"] data.azurecaf_name.windows_computer_name["data.azurecaf_name.windows_computer_name"] data.azurerm_key_vault_certificate.custom_data["data.azurerm_key_vault_certificate.custom_data"] data.azurerm_key_vault_key.custom_data["data.azurerm_key_vault_key.custom_data"] data.azurerm_key_vault_secret.custom_data["data.azurerm_key_vault_secret.custom_data"] data.azurerm_managed_disk.os_disk["data.azurerm_managed_disk.os_disk"] data.azurerm_storage_account.mssqlvm_backup_sa["data.azurerm_storage_account.mssqlvm_backup_sa"] data.external.backup_encryption_password["data.external.backup_encryption_password"] data.external.secret_key_id["data.external.secret_key_id"] data.external.sp_client_id["data.external.sp_client_id"] data.external.sp_client_secret["data.external.sp_client_secret"] data.external.sql_password["data.external.sql_password"] data.external.sql_username["data.external.sql_username"] data.external.ssh_public_key_id["data.external.ssh_public_key_id"] data.external.ssh_secret_keyvault["data.external.ssh_secret_keyvault"] data.external.windows_admin_password["data.external.windows_admin_password"] data.external.windows_admin_username["data.external.windows_admin_username"] local_sensitive_file.custom_data["local_sensitive_file.custom_data"] module.nics["module.nics"] random_password.admin["random_password.admin"] random_password.encryption_password["random_password.encryption_password"] random_password.legacy["random_password.legacy"] random_password.sql_admin_password["random_password.sql_admin_password"] tls_private_key.ssh["tls_private_key.ssh"] azurecaf_name.legacy_computer_name --> azurerm_network_interface.nic azurecaf_name.legacy_computer_name --> azurerm_network_interface_security_group_association.nic_nsg azurerm_backup_protected_vm.backup --> azurerm_linux_virtual_machine.vm azurerm_backup_protected_vm.backup --> azurerm_windows_virtual_machine.vm azurerm_dev_test_global_vm_shutdown_schedule.enabled --> azurerm_linux_virtual_machine.vm azurerm_dev_test_global_vm_shutdown_schedule.enabled --> azurerm_windows_virtual_machine.vm azurerm_key_vault_certificate.self_signed_winrm --> azurecaf_name.legacy azurerm_key_vault_certificate.self_signed_winrm --> azurerm_network_interface.nic azurerm_key_vault_certificate.self_signed_winrm --> data.azurecaf_name.windows azurerm_key_vault_secret.admin_password --> data.azurecaf_name.windows_computer_name azurerm_key_vault_secret.admin_password --> random_password.admin azurerm_key_vault_secret.backup_encryption_password --> azurerm_windows_virtual_machine.vm azurerm_key_vault_secret.backup_encryption_password --> random_password.encryption_password azurerm_key_vault_secret.sql_admin_password --> azurerm_windows_virtual_machine.vm azurerm_key_vault_secret.sql_admin_password --> random_password.sql_admin_password azurerm_key_vault_secret.ssh_private_key --> azurecaf_name.legacy_computer_name azurerm_key_vault_secret.ssh_private_key --> data.azurecaf_name.linux_computer_name azurerm_key_vault_secret.ssh_private_key --> tls_private_key.ssh azurerm_key_vault_secret.ssh_public_key_openssh --> azurecaf_name.legacy_computer_name azurerm_key_vault_secret.ssh_public_key_openssh --> data.azurecaf_name.linux_computer_name azurerm_key_vault_secret.ssh_public_key_openssh --> tls_private_key.ssh azurerm_linux_virtual_machine.vm --> data.azurecaf_name.linux azurerm_linux_virtual_machine.vm --> data.azurecaf_name.linux_computer_name azurerm_linux_virtual_machine.vm --> data.azurecaf_name.os_disk_linux azurerm_linux_virtual_machine.vm --> data.external.secret_key_id azurerm_linux_virtual_machine.vm --> data.external.ssh_public_key_id azurerm_linux_virtual_machine.vm --> data.external.ssh_secret_keyvault azurerm_linux_virtual_machine.vm --> local_sensitive_file.custom_data azurerm_linux_virtual_machine.vm --> tls_private_key.ssh azurerm_managed_disk.disk --> data.azurecaf_name.disk azurerm_mssql_virtual_machine.mssqlvm --> azurerm_linux_virtual_machine.vm azurerm_mssql_virtual_machine.mssqlvm --> azurerm_virtual_machine_data_disk_attachment.disk azurerm_mssql_virtual_machine.mssqlvm --> azurerm_windows_virtual_machine.vm azurerm_mssql_virtual_machine.mssqlvm --> data.azurerm_storage_account.mssqlvm_backup_sa azurerm_mssql_virtual_machine.mssqlvm --> data.external.backup_encryption_password azurerm_mssql_virtual_machine.mssqlvm --> data.external.sp_client_id azurerm_mssql_virtual_machine.mssqlvm --> data.external.sp_client_secret azurerm_mssql_virtual_machine.mssqlvm --> data.external.sql_password azurerm_mssql_virtual_machine.mssqlvm --> data.external.sql_username azurerm_mssql_virtual_machine.mssqlvm --> random_password.encryption_password azurerm_mssql_virtual_machine.mssqlvm --> random_password.sql_admin_password azurerm_network_interface.nic --> azurecaf_name.nic azurerm_network_interface_application_security_group_association.assoc --> azurerm_network_interface.nic azurerm_network_interface_security_group_association.nic --> azurerm_network_interface.nic azurerm_network_interface_security_group_association.nic_nsg --> azurerm_network_interface.nic azurerm_virtual_machine.vm --> azurecaf_name.legacy_computer_name azurerm_virtual_machine.vm --> azurerm_key_vault_certificate.self_signed_winrm azurerm_virtual_machine.vm --> random_password.legacy azurerm_virtual_machine.vm --> tls_private_key.ssh azurerm_virtual_machine_data_disk_attachment.disk --> azurerm_linux_virtual_machine.vm azurerm_virtual_machine_data_disk_attachment.disk --> azurerm_managed_disk.disk azurerm_virtual_machine_data_disk_attachment.disk --> azurerm_windows_virtual_machine.vm azurerm_windows_virtual_machine.vm --> azurerm_key_vault_certificate.self_signed_winrm azurerm_windows_virtual_machine.vm --> azurerm_network_interface.nic azurerm_windows_virtual_machine.vm --> azurerm_network_interface_security_group_association.nic_nsg azurerm_windows_virtual_machine.vm --> data.azurecaf_name.os_disk_windows azurerm_windows_virtual_machine.vm --> data.azurecaf_name.windows azurerm_windows_virtual_machine.vm --> data.azurecaf_name.windows_computer_name azurerm_windows_virtual_machine.vm --> random_password.admin data.azurecaf_name.linux_computer_name --> azurerm_network_interface.nic data.azurecaf_name.linux_computer_name --> azurerm_network_interface_security_group_association.nic_nsg data.azurerm_key_vault_key.custom_data --> azurerm_managed_disk.disk data.azurerm_managed_disk.os_disk --> azurerm_linux_virtual_machine.vm data.azurerm_managed_disk.os_disk --> azurerm_windows_virtual_machine.vm module.nics --> azurerm_network_interface.nic

Module Reference

Category: compute
Path: modules/compute/virtual_machine
Azure Resources: azurecaf_name, azurerm_backup_protected_vm, azurerm_dev_test_global_vm_shutdown_schedule, azurerm_key_vault_certificate, azurerm_key_vault_secret, azurerm_linux_virtual_machine, azurerm_managed_disk, azurerm_mssql_virtual_machine, azurerm_network_interface, azurerm_network_interface_application_security_group_association, azurerm_network_interface_security_group_association, azurerm_virtual_machine, azurerm_virtual_machine_data_disk_attachment, azurerm_windows_virtual_machine, local_sensitive_file, random_password, tls_private_key

Inputs

Name Description Type Required Default Validation
global_settings Global settings object (see module README.md) any yes - -
client_config Client configuration object (see module README.md). any yes - -
resource_group Resource group object to deploy the Azure resource any yes - -
keyvaults Keyvault to store the SSH public and private keys when not provided by the var.public_key_pem_file or retrieve admin ... any no - -
boot_diagnostics_storage_account (Optional) The Primary/Secondary Endpoint for the Azure Storage Account (general purpose) which should be used to sto... any no - -
settings The settings for the Azure resource. any yes - When 'shutdown_schedule.notification_settings.enabled' is true you must provide either 'email' or 'webhook_url' in settings.shutdown_schedule.notification_settings.
vnets any yes - -
public_key_pem_file If disable_password_authentication is set to true, ssh authentication is enabled. You can provide a list of file path... any no - -
managed_identities any no {} -
diagnostics any no {} -
public_ip_addresses any no {} -
recovery_vaults any no {} -
storage_accounts any no {} -
availability_sets any no {} -
base_tags Base tags for the resource to be inherited from the resource group. bool yes - -
proximity_placement_groups any no {} -
disk_encryption_sets any no {} -
application_security_groups any no {} -
virtual_machines any no {} -
image_definitions any no {} -
custom_image_ids any no {} -
network_security_groups Require a version 1 NSG definition to be attached to a nic. any no {} -
dedicated_hosts any no {} -
virtual_subnets Map of virtual_subnets objects any no {} -

Outputs

Name Description Sensitive Value
id - local.os_type == "linux" ? try(azurerm_linux_virtual_machine.vm["linux"].id, null) : try(azurerm_windows_virtual_machine.vm["windows"].id, null)
ip_configuration Adding the network_interface.nic to support remote dns on virtual networks - azurerm_network_interface.nic
os_type - local.os_type
internal_fqdns - try(var.settings.networking_interfaces, null) != null ? flatten([for nic_key in try(var.settings.virtual_machine_settings[local.os_type].network_interface_keys, []) : format("%s.%s", try(azurerm_network_interface.nic[nic_key].internal_dns_name_label, try(azurerm_linux_virtual_machine.vm["linux"].name, azurerm_windows_virtual_machine.vm["windows"].name)), azurerm_network_interface.nic[nic_key].internal_domain_name_suffix)]) : null
admin_username Local admin username - try(local.admin_username, null) == null ? var.settings.virtual_machine_settings[local.os_type].admin_username : local.admin_username
admin_password_secret_id Local admin password Key Vault secret id - try(azurerm_key_vault_secret.admin_password[local.os_type].id, null)
winrm - local.os_type == "windows" && local.keyvault != null ? {'keyvault_id': '${local.keyvault.id}', 'certificate_url': '${try(azurerm_key_vault_certificate.self_signed_winrm[local.os_type].secret_id, null)}'} : null
ssh_keys - local.create_sshkeys ? {'keyvault_id': '${local.keyvault.id}', 'ssh_private_key_pem': '${azurerm_key_vault_secret.ssh_private_key[local.os_type].name}', 'ssh_public_key_open_ssh': '${azurerm_key_vault_secret.ssh_public_key_openssh[local.os_type].name}', 'ssh_private_key_open_ssh': '${azurerm_key_vault_secret.ssh_public_key_openssh[local.os_type].name}'} : null
nic_id - coalescelist(flatten([for nic_key in try(var.settings.virtual_machine_settings[local.os_type].network_interface_keys, []) : format("%s.%s", try(azurerm_network_interface.nic[nic_key].id, try(azurerm_linux_virtual_machine.vm["linux"].name, azurerm_windows_virtual_machine.vm["windows"].name)), azurerm_network_interface.nic[nic_key].id)]), try(var.settings.networking_interface_ids, []))
nics - {for key , value in var.settings.networking_interfaces : key => {"id": "${azurerm_network_interface.nic[key].id}", "name": "${azurerm_network_interface.nic[key].name}"}}
data_disks - {for key , value in lookup(var.settings, "data_disks", {}) : key => azurerm_managed_disk.disk[key].id}
os_disk_id - data.azurerm_managed_disk.os_disk.id
identity The identity block of the virtual machine - local.os_type == "linux" ? try(azurerm_linux_virtual_machine.vm["linux"].identity, null) : try(azurerm_windows_virtual_machine.vm["windows"].identity, null)
rbac_id The object_id for the role_mapping - local.os_type == "linux" ? try(azurerm_linux_virtual_machine.vm["linux"].identity[0].principal_id, null) : try(azurerm_windows_virtual_machine.vm["windows"].identity[0].principal_id, null)
private_ip_address Map of NIC keys to private IP addresses for the VM's network interfaces - try({for nic_key in try(var.settings.virtual_machine_settings[local.os_type].network_interface_keys, []) : nic_key => (try(azurerm_network_interface.nic[nic_key].ip_configuration[0].private_ip_address, null))}, null)

Sources

  • modules/compute/virtual_machine/admin_ssh_key.tf
  • modules/compute/virtual_machine/application_security_group.tf
  • modules/compute/virtual_machine/backup.tf
  • modules/compute/virtual_machine/diagnostics.tf
  • modules/compute/virtual_machine/dynamic_custom_data.tf
  • modules/compute/virtual_machine/keyvault.tf
  • modules/compute/virtual_machine/locals.tf
  • modules/compute/virtual_machine/main.tf
  • modules/compute/virtual_machine/managed_identities.tf
  • modules/compute/virtual_machine/mssql_vm.tf
  • modules/compute/virtual_machine/network_interface.tf
  • modules/compute/virtual_machine/outputs.tf
  • modules/compute/virtual_machine/shutdown_schedule.tf
  • modules/compute/virtual_machine/variables.tf
  • modules/compute/virtual_machine/vm_disk.tf
  • modules/compute/virtual_machine/vm_legacy.tf
  • modules/compute/virtual_machine/vm_linux.tf
  • modules/compute/virtual_machine/vm_windows.tf
  • modules/compute/virtual_machine/vm_windows_winrm_self.tf