demo_solution/modules/repo_terraform.azurerm.vm/main.tf (341 lines of code) (raw):

# Get resource group data data "azurerm_resource_group" "vm_rg" { count = var.vm_location == null ? 1 : 0 name = var.vm_rg_name } # Get Subnet data data "azurerm_subnet" "vmsubnet" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic } name = each.value.nic_subnet_name virtual_network_name = each.value.nic_vnet_name resource_group_name = each.value.nic_vnet_rg_name } # Get the subscription Id data "azurerm_client_config" "current" {} # Get KV data data "azurerm_key_vault" "kek_kv" { count = var.vm_disk_encryption_install != null ? 1 : 0 name = var.kv_name resource_group_name = var.kv_rg_name } data "azurerm_key_vault_secret" "admin_secret" { count = var.vm_admin_ssh_public_key == null ? 1 : 0 name = local.vm_admin_secret_name key_vault_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}/resourceGroups/${var.kv_rg_name}/providers/Microsoft.KeyVault/vaults/${var.kv_name}" } locals { vm_admin_secret_name = var.vm_admin_secret_name == "" ? var.vm_admin_username : var.vm_admin_secret_name } data "azurerm_key_vault_secret" "ad_user_secret" { count = var.ad_domain_join != null ? 1 : 0 name = var.ad_domain_join.username_secret key_vault_id = "/subscriptions/${data.azurerm_client_config.current.subscription_id}/resourceGroups/${var.kv_rg_name}/providers/Microsoft.KeyVault/vaults/${var.kv_name}" } # Create PIP resource "azurerm_public_ip" "vm" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic if nic.public_ip != null } name = format("%s-%s-PIP", var.vm_name, each.key) location = var.vm_location == null ? data.azurerm_resource_group.vm_rg[0].location : var.vm_location resource_group_name = var.vm_rg_name allocation_method = try(each.value.public_ip.vm_pip_allocation_method, "Static") sku = try(each.value.public_ip.sku, "Basic") domain_name_label = var.vm_name zones = try(each.value.public_ip.zone_pip, ["Zone-Redundant"]) tags = var.tags == null ? {} : var.tags } # Create NIC resource "azurerm_network_interface" "vmnic" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic } name = format("%s-%s-NIC", var.vm_name, each.key) location = var.vm_location == null ? data.azurerm_resource_group.vm_rg[0].location : var.vm_location resource_group_name = var.vm_rg_name tags = var.tags == null ? {} : var.tags enable_accelerated_networking = try(each.value.enable_accelerated_networking, false) enable_ip_forwarding = try(each.value.enable_ip_forwarding, false) ip_configuration { primary = try(index(var.nic_settings, each.value), 1) == 0 ? true : false name = format("%s-%s-ipcfg", var.vm_name, each.key) subnet_id = data.azurerm_subnet.vmsubnet[each.key].id private_ip_address_allocation = try(each.value.vm_private_ip_allocation_method, "Dynamic") private_ip_address = try(each.value.vm_private_ip_allocation_method, "Dynamic") == "Static" ? try(each.value.vm_private_ip_address, null) : null public_ip_address_id = each.value.public_ip != null ? azurerm_public_ip.vm[each.key].id : null } lifecycle { ignore_changes = [ # Ignore changes to tags, e.g. because a management agent # updates these based on some ruleset managed elsewhere. tags, mac_address, virtual_machine_id ] } } # Get application security group data data "azurerm_application_security_group" "asg" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic if nic.nsg_config != null && try(nic.nsg_config.nsg_association_type, null) == "asg" } name = each.value.nsg_config.nsg_association_name resource_group_name = each.value.nsg_config.nsg_association_rg } # Get network security group data data "azurerm_network_security_group" "nsg" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic if nic.nsg_config != null && try(nic.nsg_config.nsg_association_type, null) == "nsg" } name = each.value.nsg_config.nsg_association_name resource_group_name = each.value.nsg_config.nsg_association_rg } # Create nic interface application security group association resource "azurerm_network_interface_application_security_group_association" "asg_association" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic if nic.nsg_config != null && try(nic.nsg_config.nsg_association_type, null) == "asg" } network_interface_id = azurerm_network_interface.vmnic[each.key].id application_security_group_id = data.azurerm_application_security_group.asg[each.key].id } # Create nic interface network security group association resource "azurerm_network_interface_security_group_association" "nsg_association" { for_each = { for nic in var.nic_settings : "${nic.nic_vnet_name}-${nic.nic_subnet_name}" => nic if nic.nsg_config != null && try(nic.nsg_config.nsg_association_type, null) == "nsg" } network_interface_id = azurerm_network_interface.vmnic[each.key].id network_security_group_id = data.azurerm_network_security_group.nsg[each.key].id } resource "azurerm_managed_disk" "datadisks" { for_each = var.data_disks != null ? var.data_disks : {} name = format("%s-%s", var.vm_name, each.key) location = var.vm_location == null ? data.azurerm_resource_group.vm_rg[0].location : var.vm_location resource_group_name = var.vm_rg_name storage_account_type = lookup(each.value, "storage_account_type", null) == null ? var.storage_account_type : each.value.storage_account_type create_option = "Empty" disk_size_gb = lookup(each.value, "disk_size_gb", null) == null ? "128" : each.value.disk_size_gb zone = var.zone_vm tags = var.tags == null ? {} : var.tags lifecycle { # Ignore changes to encryption_settings as these are modified by vm extension ignore_changes = [ encryption_settings, ] } } resource "azurerm_virtual_machine_data_disk_attachment" "datadisks" { for_each = var.data_disks != null ? var.data_disks : {} managed_disk_id = azurerm_managed_disk.datadisks[each.key].id virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id lun = lookup(each.value, "lun", "10" + index(keys(var.data_disks), each.key)) caching = lookup(each.value, "caching", "None") } # Windows VM NO DataDisk resource "azurerm_windows_virtual_machine" "vm_windows" { count = var.vm_guest_os == "windows" ? 1 : 0 name = var.vm_name location = var.vm_location == null ? data.azurerm_resource_group.vm_rg[0].location : var.vm_location resource_group_name = var.vm_rg_name size = var.vm_size network_interface_ids = values(azurerm_network_interface.vmnic)[*].id computer_name = var.computer_name == null ? var.vm_name : var.computer_name admin_username = var.vm_admin_username admin_password = data.azurerm_key_vault_secret.admin_secret[0].value license_type = var.license_type_windows provision_vm_agent = var.provision_vm_agent allow_extension_operations = var.provision_vm_agent zone = var.zone_vm custom_data = var.custom_data_path == null ? null : filebase64(var.custom_data_path) tags = var.tags == null ? {} : var.tags source_image_id = try(var.source_custom_image_id, null) dynamic "source_image_reference" { for_each = var.source_image_reference != null ? [var.source_image_reference] : [] content { publisher = source_image_reference.value.publisher offer = source_image_reference.value.offer sku = source_image_reference.value.sku version = try(source_image_reference.value.version, "latest") } } dynamic "plan" { for_each = var.plan != null ? [var.plan] : [] content { name = plan.value.name publisher = plan.value.publisher product = plan.value.product } } os_disk { name = format("%s-MDK001", var.vm_name) caching = var.os_disk_caching storage_account_type = var.storage_account_type disk_size_gb = var.os_disk_size_gb } dynamic "boot_diagnostics" { for_each = var.boot_diagnostics != null ? [1] : [] content { storage_account_uri = var.boot_diagnostics.storage_account_uri } } identity { type = "SystemAssigned" } } # Linux VM NO DataDisk resource "azurerm_linux_virtual_machine" "vm_linux" { count = var.vm_guest_os == "linux" ? 1 : 0 name = var.vm_name location = var.vm_location == null ? data.azurerm_resource_group.vm_rg[0].location : var.vm_location resource_group_name = var.vm_rg_name size = var.vm_size network_interface_ids = values(azurerm_network_interface.vmnic)[*].id computer_name = var.computer_name == null ? var.vm_name : var.computer_name admin_username = var.vm_admin_username admin_password = var.vm_admin_ssh_public_key == null ? sensitive(data.azurerm_key_vault_secret.admin_secret[0].value) : null provision_vm_agent = var.provision_vm_agent allow_extension_operations = var.provision_vm_agent disable_password_authentication = var.vm_admin_ssh_public_key == null ? false : true zone = var.zone_vm custom_data = var.custom_data_path == null ? null : filebase64(var.custom_data_path) tags = var.tags == null ? {} : var.tags source_image_id = var.source_custom_image_id dynamic "source_image_reference" { for_each = var.source_image_reference != null ? [var.source_image_reference] : [] content { publisher = source_image_reference.value.publisher offer = source_image_reference.value.offer sku = source_image_reference.value.sku version = try(source_image_reference.value.version, "latest") } } dynamic "plan" { for_each = var.plan != null ? [var.plan] : [] content { name = plan.value.name publisher = plan.value.publisher product = plan.value.product } } os_disk { name = format("%s-MDK001", var.vm_name) caching = var.os_disk_caching storage_account_type = var.storage_account_type disk_size_gb = var.os_disk_size_gb } dynamic "boot_diagnostics" { for_each = var.boot_diagnostics != null ? [1] : [] content { storage_account_uri = var.boot_diagnostics.storage_account_uri } } identity { type = "SystemAssigned" } dynamic "admin_ssh_key" { for_each = var.vm_admin_ssh_public_key != null ? [1] : [] content { username = var.vm_admin_username public_key = var.vm_admin_ssh_public_key } } } ########################################################################################### # Create RSA KEK for encryption BEK ########################################################################################### resource "azurerm_virtual_machine_extension" "vm_disk_encryption" { depends_on = [ azurerm_virtual_machine_data_disk_attachment.datadisks, azurerm_virtual_machine_extension.vm_diagnostic_setting, azurerm_virtual_machine_extension.post-install-script, azurerm_virtual_machine_extension.da, azurerm_virtual_machine_extension.ama ] count = var.vm_disk_encryption_install != null ? 1 : 0 name = format("%s-disk-encryption", var.vm_name) virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id publisher = "Microsoft.Azure.Security" type = var.vm_guest_os == "windows" ? "AzureDiskEncryption" : "AzureDiskEncryptionForLinux" type_handler_version = var.vm_guest_os == "windows" ? "2.2" : "1.1" auto_upgrade_minor_version = true tags = var.tags == null ? {} : var.tags settings = <<PROTECTED_SETTINGS { "EncryptionOperation": "${lookup(var.vm_disk_encryption_install, "encrypt_operation", "EnableEncryption")}", "KeyVaultURL": "${data.azurerm_key_vault.kek_kv[0].vault_uri}", "KeyVaultResourceId": "${data.azurerm_key_vault.kek_kv[0].id}", "KeyEncryptionKeyURL": "${lookup(var.vm_disk_encryption_install, "encryption_kek_url", null)}", "KekVaultResourceId": "${data.azurerm_key_vault.kek_kv[0].id}", "KeyEncryptionAlgorithm": "${lookup(var.vm_disk_encryption_install, "encryption_algorithm", "RSA-OAEP")}", "VolumeType": "${lookup(var.vm_disk_encryption_install, "volume_type", "All")}" } PROTECTED_SETTINGS } ########################################################################################### # Set VM diagnostic setting extension # LinuxDiagnostic required Python2 ########################################################################################### resource "azurerm_virtual_machine_extension" "vm_diagnostic_setting" { depends_on = [ azurerm_virtual_machine_data_disk_attachment.datadisks, azurerm_linux_virtual_machine.vm_linux ] count = var.diagnostic_setting != null ? 1 : 0 name = format("%s-DGS001", var.vm_name) virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id publisher = "Microsoft.Azure.Diagnostics" type = var.vm_guest_os == "windows" ? "IaaSDiagnostics" : "LinuxDiagnostic" type_handler_version = var.vm_guest_os == "windows" ? "1.9" : "4.0" auto_upgrade_minor_version = true tags = var.tags == null ? {} : var.tags settings = var.vm_guest_os == "windows" ? local.windows_diagnostic_settings : local.linux_diagnostic_settings protected_settings = var.vm_guest_os == "windows" ? local.windows_diagnostic_protected_settings : local.linux_diagnostic_protected_settings } ########################################################################################### # Network watcher agent ########################################################################################### resource "azurerm_virtual_machine_extension" "nw_agent" { count = var.vm_network_watcher_agent_install == true ? 1 : 0 name = format("%s-network-watcher-agent", var.vm_name) virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id publisher = "Microsoft.Azure.NetworkWatcher" type = var.vm_guest_os == "windows" ? "NetworkWatcherAgentWindows" : "NetworkWatcherAgentLinux" type_handler_version = "1.4" auto_upgrade_minor_version = true tags = var.tags == null ? {} : var.tags } ########################################################################################### # Post install script ########################################################################################### resource "azurerm_virtual_machine_extension" "post-install-script" { count = var.post_install_script_path != null ? 1 : 0 name = "post-install-script" publisher = "Microsoft.Azure.Extensions" type = "CustomScript" type_handler_version = "2.1" virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id settings = <<SETTINGS { "script": "${filebase64(var.post_install_script_path)}" } SETTINGS } ########################################################################################### # Join an Azure virtual machine into an AD Domain ########################################################################################### resource "azurerm_virtual_machine_extension" "join-domain" { count = var.ad_domain_join != null ? 1 : 0 name = format("%s-join-domain", var.vm_name) virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id publisher = "Microsoft.Compute" type = "JsonADDomainExtension" type_handler_version = "1.3" auto_upgrade_minor_version = true tags = var.tags == null ? {} : var.tags settings = <<SETTINGS { "Name": "${var.ad_domain_join.domain}", "OUPath": "${try(var.ad_domain_join.ou_path, null) != null ? var.ad_domain_join.ou_path : ""}", "User": "${var.ad_domain_join.username}", "Restart": "true", "Options": "3" } SETTINGS protected_settings = <<SETTINGS { "Password": "${data.azurerm_key_vault_secret.ad_user_secret[0].value}" } SETTINGS } ########################################################################################### # Enable VM Insights ########################################################################################### # Install Monitoring Agent resource "azurerm_virtual_machine_extension" "ama" { for_each = toset(var.vm_insights != null ? ["enabled"] : []) name = format("%s-%s", var.vm_name, var.vm_guest_os == "windows" ? "AzureMonitorWindowsAgent" : "AzureMonitorLinuxAgent") publisher = "Microsoft.Azure.Monitor" type = var.vm_guest_os == "windows" ? "AzureMonitorWindowsAgent" : "AzureMonitorLinuxAgent" type_handler_version = var.vm_guest_os == "windows" ? "1.14" : "1.25" auto_upgrade_minor_version = true automatic_upgrade_enabled = true virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id settings = jsonencode({ GCS_AUTO_CONFIG = true workspaceId = var.vm_insights.workspace_id }) protected_settings = sensitive(jsonencode({ workspaceKey = var.vm_insights.workspace_key })) lifecycle { ignore_changes = [ tags ] } } # Install Dependency Agent resource "azurerm_virtual_machine_extension" "da" { for_each = toset(var.vm_insights != null ? ["enabled"] : []) name = format("%s-%s", var.vm_name, var.vm_guest_os == "windows" ? "DependencyAgentWindows" : "DependencyAgentLinux") publisher = "Microsoft.Azure.Monitoring.DependencyAgent" type = var.vm_guest_os == "windows" ? "DependencyAgentWindows" : "DependencyAgentLinux" type_handler_version = "9.10" auto_upgrade_minor_version = true virtual_machine_id = var.vm_guest_os == "windows" ? azurerm_windows_virtual_machine.vm_windows[0].id : azurerm_linux_virtual_machine.vm_linux[0].id lifecycle { ignore_changes = [ tags ] } }