4.File.Cache/nfs.tf (228 lines of code) (raw):

################################################################## # Boost (https://learn.microsoft.com/azure/azure-boost/overview) # ################################################################## variable nfsCache { type = object({ enable = bool name = string machine = object({ size = string count = number prefix = string image = object({ publisher = string product = string name = string version = string }) osDisk = object({ storageType = string cachingMode = string sizeGB = number ephemeral = object({ enable = bool placement = string }) }) dataDisk = object({ enable = bool storageType = string cachingMode = string sizeGB = number count = number }) adminLogin = object({ userName = string userPassword = string sshKeyPublic = string passwordAuth = object({ disable = bool }) }) extension = object({ custom = object({ enable = bool name = string fileName = string parameters = object({ storageMounts = list(object({ enable = bool type = string path = string source = string options = string description = string permissions = object({ enable = bool recursive = bool octalValue = number }) })) cacheMetrics = object({ intervalSeconds = number nodeExportsPort = number customStatsPort = number }) }) }) }) }) network = object({ acceleration = object({ enable = bool }) }) }) } data azurerm_virtual_machine_scale_set cache { count = var.nfsCache.enable ? 1 : 0 name = azurerm_orchestrated_virtual_machine_scale_set.cache[0].name resource_group_name = azurerm_orchestrated_virtual_machine_scale_set.cache[0].resource_group_name } locals { nfsCache = merge(var.nfsCache, { machine = merge(var.nfsCache.machine, { image = merge(var.nfsCache.machine.image, { publisher = var.nfsCache.machine.image.publisher != "" ? var.nfsCache.machine.image.publisher : module.core.image.linux.publisher product = var.nfsCache.machine.image.product != "" ? var.nfsCache.machine.image.product : module.core.image.linux.offer name = var.nfsCache.machine.image.name != "" ? var.nfsCache.machine.image.name : module.core.image.linux.sku version = var.nfsCache.machine.image.version != "" ? var.nfsCache.machine.image.version : module.core.image.linux.version }) adminLogin = merge(var.nfsCache.machine.adminLogin, { userName = var.nfsCache.machine.adminLogin.userName != "" ? var.nfsCache.machine.adminLogin.userName : data.azurerm_key_vault_secret.admin_username.value userPassword = var.nfsCache.machine.adminLogin.userPassword != "" ? var.nfsCache.machine.adminLogin.userPassword : data.azurerm_key_vault_secret.admin_password.value sshKeyPublic = var.nfsCache.machine.adminLogin.sshKeyPublic != "" ? var.nfsCache.machine.adminLogin.sshKeyPublic : data.azurerm_key_vault_secret.ssh_key_public.value }) }) }) } resource azurerm_role_assignment monitoring_metrics_publisher { count = var.nfsCache.enable ? 1 : 0 role_definition_name = "Monitoring Metrics Publisher" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/monitor#monitoring-metrics-publisher principal_id = data.azurerm_user_assigned_identity.studio.principal_id scope = data.azurerm_monitor_data_collection_rule.studio.id } resource azurerm_role_assignment monitoring_reader { count = var.nfsCache.enable ? 1 : 0 role_definition_name = "Monitoring Reader" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/monitor#monitoring-reader principal_id = data.azurerm_user_assigned_identity.studio.principal_id scope = data.azurerm_monitor_workspace.studio.id } resource azurerm_role_assignment monitoring_contributor { count = var.nfsCache.enable ? 1 : 0 role_definition_name = "Monitoring Contributor" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/monitor#monitoring-contributor principal_id = data.azurerm_client_config.current.object_id scope = data.azurerm_monitor_workspace.studio.id } resource azurerm_role_assignment grafana_admin { count = var.nfsCache.enable ? 1 : 0 role_definition_name = "Grafana Admin" # https://learn.microsoft.com/azure/role-based-access-control/built-in-roles/monitor#grafana-admin principal_id = data.azurerm_client_config.current.object_id scope = data.azurerm_dashboard_grafana.studio.id } resource azurerm_orchestrated_virtual_machine_scale_set cache { count = var.nfsCache.enable ? 1 : 0 name = var.nfsCache.name resource_group_name = azurerm_resource_group.cache.name location = azurerm_resource_group.cache.location sku_name = var.nfsCache.machine.size instances = var.nfsCache.machine.count single_placement_group = false platform_fault_domain_count = 1 identity { type = "UserAssigned" identity_ids = [ data.azurerm_user_assigned_identity.studio.id ] } network_interface { name = "nic" primary = true ip_configuration { name = "ipConfig" primary = true subnet_id = data.azurerm_subnet.cache.id } enable_accelerated_networking = var.nfsCache.network.acceleration.enable } os_profile { custom_data = base64encode(templatefile("nfs.py", { metricsIntervalSeconds = var.nfsCache.machine.extension.custom.parameters.cacheMetrics.intervalSeconds metricsCustomStatsPort = var.nfsCache.machine.extension.custom.parameters.cacheMetrics.customStatsPort })) linux_configuration { computer_name_prefix = var.nfsCache.machine.prefix != "" ? var.nfsCache.machine.prefix : null admin_username = local.nfsCache.machine.adminLogin.userName admin_password = local.nfsCache.machine.adminLogin.userPassword disable_password_authentication = local.nfsCache.machine.adminLogin.passwordAuth.disable dynamic admin_ssh_key { for_each = local.nfsCache.machine.adminLogin.sshKeyPublic != "" ? [1] : [] content { username = local.nfsCache.machine.adminLogin.userName public_key = local.nfsCache.machine.adminLogin.sshKeyPublic } } } } os_disk { storage_account_type = var.nfsCache.machine.osDisk.storageType caching = var.nfsCache.machine.osDisk.cachingMode disk_size_gb = var.nfsCache.machine.osDisk.sizeGB > 0 ? var.nfsCache.machine.osDisk.sizeGB : null dynamic diff_disk_settings { for_each = var.nfsCache.machine.osDisk.ephemeral.enable ? [1] : [] content { option = "Local" placement = var.nfsCache.machine.osDisk.ephemeral.placement } } } source_image_reference { publisher = local.nfsCache.machine.image.publisher offer = local.nfsCache.machine.image.product sku = local.nfsCache.machine.image.name version = local.nfsCache.machine.image.version } dynamic data_disk { for_each = var.nfsCache.machine.dataDisk.enable ? [1] : [] content { storage_account_type = var.nfsCache.machine.dataDisk.storageType caching = var.nfsCache.machine.dataDisk.cachingType disk_size_gb = var.nfsCache.machine.dataDisk.sizeGB lun = 0 } } dynamic additional_capabilities { for_each = var.nfsCache.machine.dataDisk.enable ? [1] : [] content { ultra_ssd_enabled = lower(var.nfsCache.machine.dataDisk.storageType) == "ultrassd_lrs" } } dynamic extension { for_each = var.nfsCache.machine.extension.custom.enable ? [1] : [] content { name = var.nfsCache.machine.extension.custom.name type = "CustomScript" publisher = "Microsoft.Azure.Extensions" type_handler_version = data.azurerm_app_configuration_keys.studio.items[index(data.azurerm_app_configuration_keys.studio.items[*].key, data.terraform_remote_state.core.outputs.appConfig.key.scriptExtensionLinux)].value auto_upgrade_minor_version_enabled = true protected_settings = jsonencode({ script = base64encode( templatefile(var.nfsCache.machine.extension.custom.fileName, merge(var.nfsCache.machine.extension.custom.parameters, { dataDiskCount = var.nfsCache.machine.dataDisk.count metricsIntervalSeconds = var.nfsCache.machine.extension.custom.parameters.cacheMetrics.intervalSeconds metricsNodeExportsPort = var.nfsCache.machine.extension.custom.parameters.cacheMetrics.nodeExportsPort metricsCustomStatsPort = var.nfsCache.machine.extension.custom.parameters.cacheMetrics.customStatsPort metricsIngestionUrl = "${data.azurerm_monitor_data_collection_endpoint.studio.metrics_ingestion_endpoint}/dataCollectionRules/${data.azurerm_monitor_data_collection_rule.studio.immutable_id}/streams/Microsoft-PrometheusMetrics/api/v1/write?api-version=${var.monitorWorkspace.metricsIngestion.apiVersion}" exportAddressSpace = data.azurerm_virtual_network.studio.address_space[0] userIdentityClientId = data.azurerm_user_assigned_identity.studio.client_id })) ) }) } } } ############################################################################ # Private DNS (https://learn.microsoft.com/azure/dns/private-dns-overview) # ############################################################################ resource azurerm_private_dns_a_record cache_nfs { count = var.nfsCache.enable ? 1 : 0 name = lower(var.dnsRecord.name) resource_group_name = var.virtualNetwork.privateDNS.resourceGroupName zone_name = var.virtualNetwork.privateDNS.zoneName records = data.azurerm_virtual_machine_scale_set.cache[0].instances[*].private_ip_address ttl = var.dnsRecord.ttlSeconds }