From bd5de0ceadff4793b2034f28d56ab0d9f96bd000 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Thu, 24 Sep 2026 15:21:41 +0300 Subject: [PATCH] =?UTF-8?q?docs(pipeline):=20=D1=81=D1=82=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=86=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=B0=D0=BD=D0=B0=20=D0=BA=D0=B0=D0=BA=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=81=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20(=D1=88=D0=B0=D0=B3=D0=B8,=20=D0=B7=D0=BD?= =?UTF-8?q?=D0=B0=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B8=D0=B7=20=D0=9B?= =?UTF-8?q?=D0=9A,=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D1=8B)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/curated/pipeline/vdc_edge_ip_snat.md | 173 ++++++++-------------- 1 file changed, 59 insertions(+), 114 deletions(-) diff --git a/docs/curated/pipeline/vdc_edge_ip_snat.md b/docs/curated/pipeline/vdc_edge_ip_snat.md index f841def..8cb4650 100644 --- a/docs/curated/pipeline/vdc_edge_ip_snat.md +++ b/docs/curated/pipeline/vdc_edge_ip_snat.md @@ -1,127 +1,72 @@ -# Пайплайн: vDC → Edge → внешние IP → SNAT +# Как развернуть vDC, Edge, внешние IP и SNAT -> Проверено на dev-стенде 2026-09-24 (провайдер `2.0.20`): один `apply` собирает всю цепочку, -> повторный `plan` не показывает изменений, `destroy` проходит в обратном порядке. +Пошаговая инструкция. Готовые файлы — в репозитории примеров. -## Что делает пайплайн +Организацию создайте заранее в ЛК: Terraform её не создаёт. +Кластер Штурвал в эту инструкцию не входит — он разворачивается долго, отдельным шагом. -Собирает сетевую основу под нагрузку: виртуальный датацентр, периметровый шлюз, внешние IP -на организации и SNAT на шлюзе — **без ручных операций в ЛК после создания организации**. - -**Кластер Штурвал в этот пайплайн не входит** — он разворачивается очень долго, это отдельный шаг. - -## Что вне Terraform (создаётся один раз вручную) - -**Организация в Cloud Director** — одна на ресурсный realm, создать вторую нельзя. В конфиге она -адресуется по UUID (`org_uid`), а её внешние IP выделяются уже Terraform-ресурсом. - -## Порядок и почему он такой - -| # | Ресурс | Что создаёт | -|---|---|---| -| 1 | `nubes_vc_vdc` | виртуальный датацентр | -| 2 | `nubes_vc_nsxt` | сетевой шлюз периметра (Edge), ALB/AVI | -| 3 | `nubes_vc_org_ip_allocation` | внешние IP на организации (`vIPConfigure`) | -| 4 | `nubes_vc_nsxt_snat` | SNAT на шлюзе (`ipSpaceName`) | - -Порядок обязателен: шаги 3 и 4 — операции `modify`, а платформа строит список доступных `ipSpace` -из состояния `job.vcd.networkProvider` / `job.vcd.providerGateway`, то есть **требует уже созданные -vDC и Edge**. В инструкции к операции это записано прямо: «предварительно необходимо создать -Виртуальный датацентр (VDC), потом Сетевой шлюз периметра (Edge Gateway)». Если открыть `modify` -на организации без vDC/Edge, список значений падает с ошибкой `Can't cast Complex Object Type -Struct to String`. - -## Пример конфигурации - -```hcl -resource "nubes_vc_vdc" "vdc" { - resource_name = "fullpipe-vdc" - organization_uid = var.organization # имя или UUID существующей организации - network_provider = "snb1" # из ЛК - provider_vdc = "Intel Broadwell 2.4" - storage_config = jsonencode([{ name = "SATA", size = "200" }]) - suspend_on_destroy = true -} - -resource "nubes_vc_nsxt" "edge" { - resource_name = "fullpipe-edge" - vdc_type = "vdc" - vdc_uid = nubes_vc_vdc.vdc.id # Edge создаётся только после vDC - - need_enable_avi = true - virtual_services_count = 3 # Штурвалу нужно ≥ 3 - routed_net_configuration = { - ip_addr_pool = "10.10.102.0/24" - main_dns = "81.22.46.22" - second_dns = "185.247.187.77" - } -} - -# Внешние IP на организации — только после создания Edge -resource "nubes_vc_org_ip_allocation" "org_ip" { - org_uid = var.org_uid # UUID организации - - vip_configure = jsonencode([ - { name = "internet-ipv4-v1", count = "3" } - ]) - - depends_on = [nubes_vc_nsxt.edge] -} - -# SNAT на шлюзе этим ipSpace -resource "nubes_vc_nsxt_snat" "snat" { - nsxt_uid = nubes_vc_nsxt.edge.id - ip_space_name = "internet-ipv4-v1" - - depends_on = [nubes_vc_org_ip_allocation.org_ip] -} -``` - -Порядок ключей в `vip_configure` и его форматирование значения не имеют — сравнение смысловое. - -## Готовые файлы примеров - -Комплект `.tf`-файлов (vDC, Edge, аллокация IP, SNAT) лежит в отдельном репозитории примеров: - -**** - -- каталог `modify_resources/` — ресурсы-модификаторы (аллокация IP на организации + SNAT); -- `terraform.tfvars.example` — шаблон переменных (реальный `terraform.tfvars` с токеном нигде не публикуется). - -Клонирование целиком: +## 1. Скопируйте пример ```bash git clone https://gitea.services.ngcloud.ru/Nail/tf_examples.git +cd tf_examples/fullpipe_chain ``` -## Значения, которые берутся из ЛК +## 2. Возьмите значения в ЛК -| Параметр | Где смотреть | -|---|---| -| `organization_uid` / `org_uid` | карточка услуги «Организация в Cloud Director» | -| `network_provider`, `provider_vdc` | страница vDC | -| `storage_config` (имена политик) | дисковые политики ресурсного пула (`SATA`, `SSD`) | -| `ip_space_name` | список ipSpace организации (доступен после создания vDC и Edge) | - -## Удаление - -`terraform destroy` идёт в обратном порядке и сам приводит систему в исходное состояние: - -| # | Ресурс | Обратная операция | +| Что | Где взять | Пример | |---|---|---| -| 1 | `nubes_vc_nsxt_snat` | `modify` с `ipSpaceName = "no-needed"` (SNAT выключается) | -| 2 | `nubes_vc_org_ip_allocation` | `modify` с `count = "0"` (квота IP обнуляется) | -| 3 | `nubes_vc_nsxt` | удаление шлюза | -| 4 | `nubes_vc_vdc` | удаление vDC | +| Токен API | ЛК → Профиль → Токены → «Технический» | `eyJhbGciOi...` | +| UUID организации | ЛК → услуга «Организация в Cloud Director» → UUID в карточке услуги | `57eeacd1-dc7f-4a52-b903-7e5f7d3c1164` | +| Имя организации | там же — название услуги | `organ` | +| Сетевой провайдер | ЛК → vDC → «Сетевой провайдер» | `snb1` | +| Provider VDC | ЛК → vDC → «Provider VDC» | `Intel Broadwell 2.4` | +| Дисковая политика | ЛК → vDC → доступные дисковые политики | `SATA` | +| Имя ipSpace | ЛК → организация → внешние IP | `internet-ipv4-v1` | -Организацию удаление не затрагивает. Если снимать SNAT или квоту не нужно — у ресурсов есть -`keep_on_destroy = true`. +## 3. Заполните значения -## Что подтверждено живым прогоном (dev, 2026-09-24) +```bash +cp terraform.tfvars.example terraform.tfvars +``` -- вся цепочка поднимается **одним `apply`**; -- повторный `plan` не требует изменений; -- после apply в API: у организации `vIPConfigure: [{"name":"internet-ipv4-v1","count":"3"}]`, - у шлюза `ipSpaceName: "internet-ipv4-v1"`, при этом `needEnableAVI` и `virtualServicesCount` - не затираются (SNAT-модификация отправляет только своё поле); -- `destroy` выключает SNAT и обнуляет квоту, орг остаётся живой. +```hcl +api_token = "eyJhbGciOi..." # токен из шага 2 +organization = "organ" # имя организации +org_uid = "57eeacd1-dc7f-4a52-b903-7e5f7d3c1164" # UUID организации +ip_space_name = "internet-ipv4-v1" +ip_count = "3" +``` + +## 4. Выполните команды + +```bash +terraform init # один раз — скачает провайдер +terraform plan # покажет, что будет создано +terraform apply # создаст (подтвердить: yes) +``` + +## 5. Проверьте результат + +- в ЛК появились виртуальный датацентр и сетевой шлюз; +- на организации выделены внешние IP; +- на шлюзе включён SNAT; +- повторный `terraform plan` изменений не показывает. + +## 6. Удаление + +```bash +terraform destroy +``` + +SNAT выключается, квота IP обнуляется, затем удаляются шлюз и vDC. Организация не удаляется. + +## Файлы примера + +| Файл | Что делает | +|---|---| +| `main.tf` | провайдер и переменные | +| `vdc.tf` | виртуальный датацентр | +| `edge.tf` | сетевой шлюз периметра (Edge) | +| `modifiers.tf` | внешние IP на организации + SNAT на шлюзе | +| `terraform.tfvars.example` | шаблон значений из ЛК |