From 15cd369ec3898e85b7883b61708b2ea03fdb7c28 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Mon, 28 Sep 2026 07:54:50 +0300 Subject: [PATCH] =?UTF-8?q?feat(fpipeline):=20=D0=92=D0=9C=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B9=D0=BF=D0=BB=D0=B0=D0=B9=D0=BD=20FPipeGmail?= =?UTF-8?q?=20=E2=80=94=20=D1=81=D0=B0=D0=BC=D0=BE=D0=B4=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D1=87=D0=BD=D1=8B=D0=B9=20vm.tf=20(vApp=2026?= =?UTF-8?q?=20+=20=D0=92=D0=9C=2028),=20=D0=B2=D0=BD=D0=B5=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B9=20IP=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=89=D0=B8=D0=B9=20SNAT,=20suspend=5Fon=5Fdestroy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DEV_STAND/FPipeGmail/vm.tf | 183 +++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 DEV_STAND/FPipeGmail/vm.tf diff --git a/DEV_STAND/FPipeGmail/vm.tf b/DEV_STAND/FPipeGmail/vm.tf new file mode 100644 index 0000000..a8e57e8 --- /dev/null +++ b/DEV_STAND/FPipeGmail/vm.tf @@ -0,0 +1,183 @@ +# ============================================================================= +# Виртуальная машина внутри vApp — услуги 26 (vApp) и 28 (ВМ) +# +# Всё, что относится к ВМ, лежит ТОЛЬКО в этом файле: переменные, их значения +# по умолчанию, оба ресурса и выводы. Чтобы выключить ВМ — удалить или +# закомментировать этот файл (по аналогии с shturval.tf). +# +# Место в цепочке: +# орга (вручную в ЛК) → vDC (21) → Edge (22) → внешние IP → SNAT +# → [ vApp (26) → ВМ (28) ] → Штурвал (150) +# +# Зависимости (из манифестов услуг, сгенерированные ресурсы): +# vApp (26) — nubes_vapp: требует vdc_uid (21) и nsxt_uid (22) +# ВМ (28) — nubes_vc_vm_v3: требует vapp_uid (26) +# +# Внешний доступ: ВМ публикуется за общим SNAT эджа (same_snat = false), для +# этого ipSpace должен быть выделен на организации и включён как SNAT +# (см. modifiers.tf). Нужен ВЫДЕЛЕННЫЙ внешний адрес — same_snat = true. +# ipSpace для ВМ берём тот же, что у SNAT (var.ip_space_name). +# +# Режим destroy: у обеих услуг операция delete требует предварительного +# suspend, поэтому по умолчанию suspend_on_destroy = true («заморозка»). +# Полное удаление vApp возможно только через 14 дней после suspend. +# ============================================================================= + +# --- Переменные vApp --- + +variable "vapp_resource_name" { + type = string + default = "fullpipe-vapp" + description = "Имя услуги «Виртуальный каталог ВМ (vApp)» в ЛК" +} + +variable "vapp_name" { + type = string + default = "fullpipe-vapp-01" + description = "Имя vApp. Маска ^[a-z0-9][a-z0-9.-]{3,61}[a-z0-9]$, уникально в организации; участвует в DNS-имени ВМ. НЕ оставлять дефолтом платформы." +} + +# --- Переменные ВМ --- + +variable "vm_resource_name" { + type = string + default = "fullpipe-vm-01" + description = "Имя услуги «Виртуальная машина» в ЛК" +} + +variable "vm_name" { + type = string + default = "web01" + description = "Имя ВМ. Маска ^[a-z0-9][a-z0-9.-]{1,61}[a-z0-9]$. Определяет имя NSX-T IP Set: {vapp_name}-{vm_name}" +} + +variable "vm_image" { + type = string + default = "Ubuntu_22-20G" + description = "Образ ОС. Доступные значения: RockyLinux_9-16G-cloudinit, Ubuntu_22-20G, Debian_13-20G. Не изменяется после создания" +} + +variable "vm_cpu" { + type = number + default = 2 + description = "vCPU (1..64), шт" +} + +variable "vm_ram" { + type = number + default = 2 + description = "RAM (1..256), GB" +} + +variable "vm_disk" { + type = number + default = 20 + description = "Дополнительный диск, GB (основной диск зависит от образа)" +} + +variable "vm_user_login" { + type = string + default = "ubuntu" + description = "Учётка SSH. Не изменяется после создания" +} + +variable "vm_user_public_key" { + type = string + description = "Публичная часть SSH-ключа в формате OpenSSH. Не изменяется после создания. Значение — в terraform.tfvars" +} + +variable "vm_access_port_list" { + type = list(object({ + port = string + type = string + })) + default = [ + { port = "22", type = "tcp" } + ] + description = "Белый список портов для доступа извне; type: tcp | udp | all" +} + +variable "vm_access_ip_list" { + type = list(string) + default = ["0.0.0.0/0"] + description = "Белый список адресов, которым разрешён доступ к ВМ. Требует выделенного внешнего IP" +} + +variable "vm_same_snat" { + type = bool + default = false + description = "false — публикация за общим SNAT эджа; true — за выделенным внешним IP услуги" +} + +# --- vApp (услуга 26) --- + +resource "nubes_vapp" "vapp" { + resource_name = var.vapp_resource_name + vapp_name = var.vapp_name + + vdc_uid = nubes_vc_vdc.vdc.id # ref 21 — вычислительная инфраструктура + nsxt_uid = nubes_vc_nsxt.edge.id # ref 22 — сеть/маршрутизация + + # «Заморозка»: destroy переводит vApp в suspend (delete требует suspend). + suspend_on_destroy = true + + # Повторный apply усыновляет существующий vApp, а не падает с + # «РЕСУРС С ТАКИМ ИМЕНЕМ УЖЕ СУЩЕСТВУЕТ». + adopt_existing_on_create = true + + # vApp требует готовую сеть (ipSpace на организации + SNAT на эдже). + depends_on = [nubes_vc_nsxt_snat.snat] +} + +# --- ВМ (услуга 28) --- + +resource "nubes_vc_vm_v3" "vm" { + resource_name = var.vm_resource_name + vm_name = var.vm_name + + vapp_uid = nubes_vapp.vapp.id # ref 26 — ВМ размещается в vApp + image_vm = var.vm_image + + vm_cpu = var.vm_cpu + vm_ram = var.vm_ram + vm_disk = var.vm_disk + + user_login = var.vm_user_login + user_public_key = var.vm_user_public_key + + # Внешний доступ + ip_space_name = var.ip_space_name # тот же ipSpace, что у SNAT эджа + same_snat = var.vm_same_snat + access_port_list = jsonencode(var.vm_access_port_list) + access_ip_list = jsonencode(var.vm_access_ip_list) + + # «Заморозка»: destroy переводит ВМ в suspend. + suspend_on_destroy = true + + adopt_existing_on_create = true + + # ВМ создаётся платформой долго — поднимаем таймаут ожидания. + operation_timeout = "15m" +} + +# --- Выводы --- + +output "vapp_id" { + description = "UID созданного vApp (услуга 26)" + value = nubes_vapp.vapp.id +} + +output "vapp_name" { + description = "Имя vApp" + value = nubes_vapp.vapp.vapp_name +} + +output "vm_id" { + description = "UID созданной ВМ (услуга 28)" + value = nubes_vc_vm_v3.vm.id +} + +output "vm_state_flat" { + description = "Плоский state ВМ — IP-адреса, статус и т.д." + value = nubes_vc_vm_v3.vm.state_out_flat +}