# ============================================================================= # Ресурсы-модификаторы (операции modify, которых нет в create-схеме ресурсов) # # Порядок строго такой: # орга (создана вручную в ЛК) # -> nubes_vc_vdc.vdc # -> nubes_vc_nsxt.edge # -> nubes_vc_org_ip_allocation (выделение внешних IP на орге) # -> nubes_vc_nsxt_snat (SNAT на эдже этим ipSpace) # # Почему аллокация ПОСЛЕ эджа: платформа строит список ipSpace из состояния # `job.vcd.networkProvider` / `job.vcd.providerGateway`, то есть требует уже # созданный vDC и Edge. Иначе modify на орге падает # («Can't cast Complex Object Type Struct to String»). # ============================================================================= # 1. Внешние IP на организации (modify: vIPConfigure, массив перезаписывается целиком) resource "nubes_vc_org_ip_allocation" "org_ip" { organization = var.organization vip_configure = jsonencode([ { name = var.ip_space_name count = var.ip_count } ]) # true = «заморозка»: destroy не трогает квоту внешних IP (кластер Штурвала держит # адреса, опустить count ниже занятых платформа не даёт). Для полного удаления — false # (и только после удаления кластера). keep_on_destroy = true depends_on = [nubes_vc_nsxt.edge] } # 2. SNAT на эдже (modify: ipSpaceName) resource "nubes_vc_nsxt_snat" "snat" { nsxt_uid = nubes_vc_nsxt.edge.id ip_space_name = var.ip_space_name # true = «заморозка»: destroy не выключает SNAT на эдже. Для полного удаления — false. keep_on_destroy = true # ipSpace должен быть уже выделен на организации depends_on = [nubes_vc_org_ip_allocation.org_ip] } output "allocated_org_ip" { description = "Выделено внешних IP на организации" value = { organization = var.organization ip_space_name = var.ip_space_name ip_count = var.ip_count } } output "snat_ip_space" { description = "ipSpace, включённый как SNAT на эдже" value = nubes_vc_nsxt_snat.snat.ip_space_name }