diff --git a/DEV_STAND/FullPipe/modifiers.tf b/DEV_STAND/FullPipe/modifiers.tf new file mode 100644 index 0000000..a12b137 --- /dev/null +++ b/DEV_STAND/FullPipe/modifiers.tf @@ -0,0 +1,57 @@ +# ============================================================================= +# Ресурсы-модификаторы (операции 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" { + org_uid = var.org_uid + + vip_configure = jsonencode([ + { + name = var.ip_space_name + count = var.ip_count + } + ]) + + # false = при destroy отправить обратный modify с count=0 (квота обнулится) + keep_on_destroy = false + + 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 + + keep_on_destroy = false + + # ipSpace должен быть уже выделен на организации + depends_on = [nubes_vc_org_ip_allocation.org_ip] +} + +output "allocated_org_ip" { + description = "Выделено внешних IP на организации" + value = { + org_uid = var.org_uid + 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 +} diff --git a/DEV_STAND/FullPipe/variables.tf b/DEV_STAND/FullPipe/variables.tf index dbe8a3e..4f0ee97 100644 --- a/DEV_STAND/FullPipe/variables.tf +++ b/DEV_STAND/FullPipe/variables.tf @@ -16,6 +16,25 @@ variable "organization" { description = "Имя или UUID организации (vc_org)" } +# UUID той же организации — нужен ресурсам-модификаторам (они адресуются строго по uid) +variable "org_uid" { + type = string + description = "UUID организации (vc_org) для nubes_vc_org_ip_allocation" +} + +# --- Модификаторы (IP на орге + SNAT на эдже) --- + +variable "ip_space_name" { + type = string + description = "Имя ipSpace, доступное организации (смотреть в ЛК, напр. internet-ipv4-v1)" +} + +variable "ip_count" { + type = string + default = "3" + description = "Сколько внешних IP выделить на организации (count — строка)" +} + variable "vdc_resource_name" { type = string default = "fullpipe-vdc" diff --git a/DEV_STAND/FullPipe/versions.tf b/DEV_STAND/FullPipe/versions.tf index 2ef02f3..0f07ad6 100644 --- a/DEV_STAND/FullPipe/versions.tf +++ b/DEV_STAND/FullPipe/versions.tf @@ -4,7 +4,7 @@ terraform { required_providers { nubes = { source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" - version = "2.0.17" + version = "2.0.19" } } }