main.tf (310 lines of code) (raw):
resource "azurerm_orchestrated_virtual_machine_scale_set" "virtual_machine_scale_set" {
location = var.location
name = var.name
platform_fault_domain_count = var.platform_fault_domain_count
resource_group_name = var.resource_group_name
capacity_reservation_group_id = var.capacity_reservation_group_id
encryption_at_host_enabled = var.encryption_at_host_enabled
eviction_policy = var.eviction_policy
extension_operations_enabled = var.extension_operations_enabled
extensions_time_budget = var.extensions_time_budget
instances = var.instances
license_type = var.license_type
max_bid_price = var.max_bid_price
priority = var.priority
proximity_placement_group_id = var.proximity_placement_group_id
single_placement_group = var.single_placement_group
sku_name = var.sku_name
source_image_id = var.source_image_id
tags = var.tags
user_data_base64 = var.user_data_base64
zone_balance = var.zone_balance
zones = var.zones
dynamic "additional_capabilities" {
for_each = var.additional_capabilities == null ? [] : [var.additional_capabilities]
content {
ultra_ssd_enabled = additional_capabilities.value.ultra_ssd_enabled
}
}
dynamic "automatic_instance_repair" {
for_each = var.automatic_instance_repair == null ? [] : [var.automatic_instance_repair]
content {
enabled = automatic_instance_repair.value.enabled
grace_period = automatic_instance_repair.value.grace_period
}
}
dynamic "boot_diagnostics" {
for_each = var.boot_diagnostics == null ? [] : [var.boot_diagnostics]
content {
storage_account_uri = boot_diagnostics.value.storage_account_uri
}
}
dynamic "data_disk" {
for_each = var.data_disk == null ? [] : var.data_disk
content {
caching = data_disk.value.caching
storage_account_type = data_disk.value.storage_account_type
create_option = data_disk.value.create_option
disk_encryption_set_id = data_disk.value.disk_encryption_set_id
disk_size_gb = data_disk.value.disk_size_gb
lun = data_disk.value.lun
ultra_ssd_disk_iops_read_write = data_disk.value.ultra_ssd_disk_iops_read_write
ultra_ssd_disk_mbps_read_write = data_disk.value.ultra_ssd_disk_mbps_read_write
write_accelerator_enabled = data_disk.value.write_accelerator_enabled
}
}
dynamic "extension" {
for_each = var.extension == null ? [] : var.extension
content {
name = extension.value.name
publisher = extension.value.publisher
type = extension.value.type
type_handler_version = extension.value.type_handler_version
auto_upgrade_minor_version_enabled = extension.value.auto_upgrade_minor_version_enabled
extensions_to_provision_after_vm_creation = extension.value.extensions_to_provision_after_vm_creation
failure_suppression_enabled = extension.value.failure_suppression_enabled
force_extension_execution_on_change = extension.value.force_extension_execution_on_change
protected_settings = lookup(var.extension_protected_setting, extension.value.name, "")
settings = extension.value.settings
dynamic "protected_settings_from_key_vault" {
for_each = extension.value.protected_settings_from_key_vault == null ? [] : [extension.value.protected_settings_from_key_vault]
content {
secret_url = protected_settings_from_key_vault.value.secret_url
source_vault_id = protected_settings_from_key_vault.value.source_vault_id
}
}
}
}
dynamic "identity" {
for_each = local.managed_identities.user_assigned
content {
identity_ids = identity.value.user_assigned_resource_ids
type = identity.value.type
}
}
dynamic "network_interface" {
for_each = var.network_interface == null ? [] : var.network_interface
content {
name = network_interface.value.name
dns_servers = network_interface.value.dns_servers
enable_accelerated_networking = network_interface.value.enable_accelerated_networking
enable_ip_forwarding = network_interface.value.enable_ip_forwarding
network_security_group_id = network_interface.value.network_security_group_id
primary = network_interface.value.primary
dynamic "ip_configuration" {
for_each = network_interface.value.ip_configuration
content {
name = ip_configuration.value.name
application_gateway_backend_address_pool_ids = ip_configuration.value.application_gateway_backend_address_pool_ids
application_security_group_ids = ip_configuration.value.application_security_group_ids
load_balancer_backend_address_pool_ids = ip_configuration.value.load_balancer_backend_address_pool_ids
primary = ip_configuration.value.primary
subnet_id = ip_configuration.value.subnet_id
version = ip_configuration.value.version
dynamic "public_ip_address" {
for_each = ip_configuration.value.public_ip_address == null ? [] : ip_configuration.value.public_ip_address
content {
name = public_ip_address.value.name
domain_name_label = public_ip_address.value.domain_name_label
idle_timeout_in_minutes = public_ip_address.value.idle_timeout_in_minutes
public_ip_prefix_id = public_ip_address.value.public_ip_prefix_id
sku_name = public_ip_address.value.sku_name
version = public_ip_address.value.version
dynamic "ip_tag" {
for_each = public_ip_address.value.ip_tag == null ? [] : public_ip_address.value.ip_tag
content {
tag = ip_tag.value.tag
type = ip_tag.value.type
}
}
}
}
}
}
}
}
dynamic "os_disk" {
for_each = var.os_disk == null ? [] : [var.os_disk]
content {
caching = os_disk.value.caching
storage_account_type = os_disk.value.storage_account_type
disk_encryption_set_id = os_disk.value.disk_encryption_set_id
disk_size_gb = os_disk.value.disk_size_gb
write_accelerator_enabled = os_disk.value.write_accelerator_enabled
dynamic "diff_disk_settings" {
for_each = os_disk.value.diff_disk_settings == null ? [] : [os_disk.value.diff_disk_settings]
content {
option = diff_disk_settings.value.option
placement = diff_disk_settings.value.placement
}
}
}
}
dynamic "os_profile" {
for_each = var.os_profile == null ? [] : [var.os_profile]
content {
custom_data = os_profile.value.custom_data
dynamic "linux_configuration" {
for_each = os_profile.value.linux_configuration == null ? [] : [os_profile.value.linux_configuration]
content {
admin_username = linux_configuration.value.admin_username
admin_password = var.admin_password
computer_name_prefix = linux_configuration.value.computer_name_prefix
disable_password_authentication = linux_configuration.value.disable_password_authentication
patch_assessment_mode = linux_configuration.value.patch_assessment_mode
patch_mode = linux_configuration.value.patch_mode
provision_vm_agent = linux_configuration.value.provision_vm_agent
dynamic "admin_ssh_key" {
for_each = linux_configuration.value.admin_ssh_key_id == null ? [] : linux_configuration.value.admin_ssh_key_id
content {
public_key = lookup(
{ for key in var.admin_ssh_keys : key.id => key.public_key },
admin_ssh_key.value,
null
)
username = lookup(
{ for key in var.admin_ssh_keys : key.id => key.username },
admin_ssh_key.value,
null
)
}
}
dynamic "secret" {
for_each = linux_configuration.value.secret == null ? [] : linux_configuration.value.secret
content {
key_vault_id = secret.value.key_vault_id
dynamic "certificate" {
for_each = secret.value.certificate == null ? [] : secret.value.certificate
content {
url = certificate.value.url
}
}
}
}
}
}
dynamic "windows_configuration" {
for_each = os_profile.value.windows_configuration == null ? [] : [os_profile.value.windows_configuration]
content {
admin_password = var.admin_password
admin_username = windows_configuration.value.admin_username
computer_name_prefix = windows_configuration.value.computer_name_prefix
enable_automatic_updates = windows_configuration.value.enable_automatic_updates
hotpatching_enabled = windows_configuration.value.hotpatching_enabled
patch_assessment_mode = windows_configuration.value.patch_assessment_mode
patch_mode = windows_configuration.value.patch_mode
provision_vm_agent = windows_configuration.value.provision_vm_agent
timezone = windows_configuration.value.timezone
dynamic "secret" {
for_each = windows_configuration.value.secret == null ? [] : windows_configuration.value.secret
content {
key_vault_id = secret.value.key_vault_id
dynamic "certificate" {
for_each = secret.value.certificate == null ? [] : secret.value.certificate
content {
store = certificate.value.store
url = certificate.value.url
}
}
}
}
dynamic "winrm_listener" {
for_each = windows_configuration.value.winrm_listener == null ? [] : windows_configuration.value.winrm_listener
content {
protocol = winrm_listener.value.protocol
certificate_url = winrm_listener.value.certificate_url
}
}
}
}
}
}
dynamic "plan" {
for_each = var.plan == null ? [] : [var.plan]
content {
name = plan.value.name
product = plan.value.product
publisher = plan.value.publisher
}
}
dynamic "priority_mix" {
for_each = var.priority_mix == null ? [] : [var.priority_mix]
content {
base_regular_count = priority_mix.value.base_regular_count
regular_percentage_above_base = priority_mix.value.regular_percentage_above_base
}
}
dynamic "source_image_reference" {
for_each = var.source_image_reference == null ? [] : [var.source_image_reference]
content {
offer = source_image_reference.value.offer
publisher = source_image_reference.value.publisher
sku = source_image_reference.value.sku
version = source_image_reference.value.version
}
}
dynamic "termination_notification" {
for_each = var.termination_notification == null ? [] : [var.termination_notification]
content {
enabled = termination_notification.value.enabled
timeout = termination_notification.value.timeout
}
}
dynamic "timeouts" {
for_each = var.timeouts == null ? [] : [var.timeouts]
content {
create = timeouts.value.create
delete = timeouts.value.delete
read = timeouts.value.read
update = timeouts.value.update
}
}
}
resource "azapi_update_resource" "set_update_policy" {
type = "Microsoft.Compute/virtualMachineScaleSets@2024-07-01"
body = merge(
var.upgrade_policy.upgrade_mode != "Rolling" ? {
properties = {
upgradePolicy = {
mode = var.upgrade_policy.upgrade_mode
}
}
} : {},
var.upgrade_policy.upgrade_mode == "Rolling" ? {
properties = {
upgradePolicy = {
mode = var.upgrade_policy.upgrade_mode
rollingUpgradePolicy = {
enableCrossZoneUpgrade = var.upgrade_policy.rolling_upgrade_policy.cross_zone_upgrades_enabled
maxBatchInstancePercent = var.upgrade_policy.rolling_upgrade_policy.max_batch_instance_percent
maxUnhealthyInstancePercent = var.upgrade_policy.rolling_upgrade_policy.max_unhealthy_instance_percent
maxUnhealthyUpgradedInstancePercent = var.upgrade_policy.rolling_upgrade_policy.max_unhealthy_upgraded_instance_percent
pauseTimeBetweenBatches = var.upgrade_policy.rolling_upgrade_policy.pause_time_between_batches
prioritizeUnhealthyInstances = var.upgrade_policy.rolling_upgrade_policy.prioritize_unhealthy_instances_enabled
maxSurge = var.upgrade_policy.rolling_upgrade_policy.maximum_surge_instances_enabled
}
}
}
} : {}
)
resource_id = azurerm_orchestrated_virtual_machine_scale_set.virtual_machine_scale_set.id
}
# AVM Required Code
resource "azurerm_management_lock" "this" {
count = var.lock != null ? 1 : 0
lock_level = var.lock.kind
name = coalesce(var.lock.name, "lock-${var.lock.kind}")
scope = azurerm_orchestrated_virtual_machine_scale_set.virtual_machine_scale_set.id
notes = var.lock.kind == "CanNotDelete" ? "Cannot delete the resource or its child resources." : "Cannot delete or modify the resource or its child resources."
}
resource "azurerm_role_assignment" "this" {
for_each = var.role_assignments
principal_id = each.value.principal_id
scope = azurerm_orchestrated_virtual_machine_scale_set.virtual_machine_scale_set.id
condition = each.value.condition
condition_version = each.value.condition_version
delegated_managed_identity_resource_id = each.value.delegated_managed_identity_resource_id
principal_type = each.value.principal_type
role_definition_id = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? each.value.role_definition_id_or_name : null
role_definition_name = strcontains(lower(each.value.role_definition_id_or_name), lower(local.role_definition_resource_substring)) ? null : each.value.role_definition_id_or_name
skip_service_principal_aad_check = each.value.skip_service_principal_aad_check
}