diff --git a/fullpipe_chain/README.md b/fullpipe_chain/README.md index b29ac0e..6fa4910 100644 --- a/fullpipe_chain/README.md +++ b/fullpipe_chain/README.md @@ -1,66 +1,85 @@ # vDC → Edge → внешние IP → SNAT -Поднимает сетевую основу: виртуальный датацентр, сетевой шлюз периметра, внешние IP на организации -и SNAT на шлюзе. **Кластер Штурвал сюда не входит** — он разворачивается очень долго, отдельным шагом. +Пример поднимает сетевую основу в Nubes: -Организацию создайте заранее в ЛК — в Terraform она не создаётся. +- виртуальный датацентр (vDC); +- сетевой шлюз периметра (Edge); +- внешние IP на организации; +- SNAT на шлюзе. -## 1. Возьмите значения в ЛК +Кластер Штурвал сюда **не входит** — он разворачивается долго, отдельным шагом. +Организацию создайте заранее в ЛК: Terraform её не создаёт и не удаляет. -| Что | Где взять | Пример | +**Перед началом:** нужен установленный Terraform 1.5 или новее. Провайдер скачается сам +при `terraform init` — отдельно ставить ничего не нужно. + +## 1. Скачайте пример + +```bash +git clone https://gitea.services.ngcloud.ru/Nail/tf_examples.git +cd tf_examples/fullpipe_chain +``` + +## 2. Возьмите значения в ЛК + +| Значение | Где взять | Пример | |---|---|---| -| Токен 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` | +| `api_token` | ЛК → Профиль → Токены → «Технический» | `eyJhbGciOi...` | +| `organization` | ЛК → услуга «Организация в Cloud Director» → название услуги | `organ` | +| `vdc_network_provider` | ЛК → создание vDC → «Сетевой провайдер» | `snb1` | +| `vdc_provider_vdc` | ЛК → создание vDC → «Provider VDC» | `Intel Broadwell 2.4` | +| `vdc_storage_config` | ЛК → создание vDC → доступные дисковые политики | `SATA` | +| `ip_space_name` | ЛК → карточка организации → внешние IP | `internet-ipv4-v1` | -## 2. Заполните terraform.tfvars +Остальные значения уже подставлены в `terraform.tfvars.example` — меняйте, если нужно. + +## 3. Заполните terraform.tfvars ```bash cp terraform.tfvars.example terraform.tfvars +nano terraform.tfvars # подставьте значения из шага 2 ``` -```hcl -api_token = "eyJhbGciOi..." # токен из шага 1 -organization = "organ" # имя организации -org_uid = "57eeacd1-dc7f-4a52-b903-7e5f7d3c1164" # UUID организации -ip_space_name = "internet-ipv4-v1" -ip_count = "3" -``` +Полный список параметров — в `variables.tf`, у каждой переменной есть описание. -## 3. Выполните команды +## 4. Выполните команды ```bash terraform init # один раз — скачает провайдер -terraform plan # покажет, что будет создано +terraform plan # покажет, что будет создано (4 ресурса), ничего не меняет terraform apply # создаст (подтвердить: yes) ``` -## 4. Проверьте результат +## 5. Проверьте результат -- в ЛК появились виртуальный датацентр и сетевой шлюз; -- на организации выделены внешние IP; -- на шлюзе включён SNAT; -- `terraform plan` повторно не показывает изменений. +```bash +terraform output # UUID и имена созданных услуг +``` -## 5. Удаление +И в ЛК: появились vDC и Edge, на организации выделены внешние IP, на шлюзе включён SNAT. +Повторный `terraform plan` должен показать `No changes`. + +## 6. Удаление ```bash terraform destroy ``` -Порядок обратный: SNAT выключается, квота IP обнуляется, затем удаляются шлюз и vDC. +Порядок обратный: SNAT выключается, квота внешних IP обнуляется, затем удаляется шлюз, +а vDC приостанавливается (данные сохраняются). **Организация не удаляется.** ## Состав файлов | Файл | Что делает | |---|---| -| `main.tf` | провайдер и переменные | +| `versions.tf` | версия Terraform и провайдера Nubes | +| `provider.tf` | подключение к API (токен, адрес) | +| `variables.tf` | все параметры с описанием | | `vdc.tf` | виртуальный датацентр | | `edge.tf` | сетевой шлюз периметра (Edge) | | `modifiers.tf` | внешние IP на организации + SNAT на шлюзе | -| `terraform.tfvars.example` | шаблон значений из ЛК | +| `outputs.tf` | UUID и имена созданных услуг | +| `terraform.tfvars.example` | шаблон значений (копируется в `terraform.tfvars`) | + +`terraform.tfvars` с токеном никому не передавайте и не коммитьте в git. diff --git a/fullpipe_chain/edge.tf b/fullpipe_chain/edge.tf index 71f1aa9..4e22f03 100644 --- a/fullpipe_chain/edge.tf +++ b/fullpipe_chain/edge.tf @@ -1,16 +1,23 @@ -# Сетевой шлюз периметра (Edge) +# Сетевой шлюз периметра (Edge) — создаётся внутри vDC, объявленного в vdc.tf. resource "nubes_vc_nsxt" "edge" { - resource_name = "fullpipe-edge" + # имя услуги в ЛК (любое, удобное вам) + resource_name = var.nsxt_resource_name - vdc_type = "vdc" - vdc_uid = nubes_vc_vdc.vdc.id # Edge создаётся после vDC + # родительская услуга: vdc (нужен vdc_uid) или vdcGroup + vdc_type = var.nsxt_vdc_type - need_enable_avi = true - virtual_services_count = 3 # Штурвалу нужно не меньше 3 + # ссылка на vDC: сначала создаётся vDC, потом шлюз + vdc_uid = nubes_vc_vdc.vdc.id + # балансировщик (ALB): включён; виртуальных сервисов 1..4, + # для кластера Штурвал нужно не меньше 3 + need_enable_avi = var.nsxt_need_enable_avi + virtual_services_count = var.nsxt_virtual_services_count + + # сеть шлюза: пул адресов (маска /24 обязательна) и DNS для машин routed_net_configuration = { - ip_addr_pool = "10.10.102.0/24" - main_dns = "81.22.46.22" - second_dns = "185.247.187.77" + ip_addr_pool = var.nsxt_ip_addr_pool + main_dns = var.nsxt_main_dns + second_dns = var.nsxt_second_dns } } diff --git a/fullpipe_chain/main.tf b/fullpipe_chain/main.tf deleted file mode 100644 index c34f693..0000000 --- a/fullpipe_chain/main.tf +++ /dev/null @@ -1,42 +0,0 @@ -terraform { - required_providers { - nubes = { - source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" - version = "2.0.20" - } - } -} - -provider "nubes" { - api_token = var.api_token - api_endpoint = "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc" -} - -# --- значения берутся из ЛК (см. README) --- - -variable "api_token" { - type = string - sensitive = true - description = "ЛК → Профиль → Токены → «Технический»" -} - -variable "organization" { - type = string - description = "Имя организации из ЛК (например: organ)" -} - -variable "org_uid" { - type = string - description = "UUID той же организации (нужен ресурсу аллокации IP)" -} - -variable "ip_space_name" { - type = string - description = "Имя ipSpace, доступное организации (например: internet-ipv4-v1)" -} - -variable "ip_count" { - type = string - default = "3" - description = "Сколько внешних IP выделить (строка)" -} diff --git a/fullpipe_chain/modifiers.tf b/fullpipe_chain/modifiers.tf index 98cd7b3..6757f42 100644 --- a/fullpipe_chain/modifiers.tf +++ b/fullpipe_chain/modifiers.tf @@ -1,7 +1,25 @@ -# Внешние IP на организации (создаётся после Edge) -resource "nubes_vc_org_ip_allocation" "org_ip" { - org_uid = var.org_uid +# ============================================================================= +# Ресурсы, которые выполняют операции modify над уже созданными услугами. +# +# Порядок строго такой: +# организация (создаётся заранее в ЛК) +# -> nubes_vc_vdc.vdc +# -> nubes_vc_nsxt.edge +# -> nubes_vc_org_ip_allocation (внешние IP на организации) +# -> nubes_vc_nsxt_snat (SNAT на шлюзе этим ipSpace) +# +# Аллокация IP идёт ПОСЛЕ шлюза: платформа строит список доступных ipSpace +# только когда vDC и Edge уже созданы. Если поменять порядок — modify упадёт +# с ошибкой «Can't cast Complex Object Type Struct to String». +# ============================================================================= +# 1. Внешние IP на организации. +resource "nubes_vc_org_ip_allocation" "org_ip" { + # та же организация, что у vDC: название услуги из ЛК или её UUID + organization = var.organization + + # сколько IP выделить: name — имя ipSpace, count — количество (строкой). + # массив передаётся целиком, поэтому старые значения перезаписываются vip_configure = jsonencode([ { name = var.ip_space_name @@ -9,22 +27,35 @@ resource "nubes_vc_org_ip_allocation" "org_ip" { } ]) + # при destroy: false — квота обнуляется (count=0); true — оставить как есть + keep_on_destroy = false + depends_on = [nubes_vc_nsxt.edge] } -# SNAT на шлюзе этим ipSpace. -# При удалении отправляется ipSpaceName = "no-needed" (SNAT выключается). +# 2. SNAT на шлюзе: внешние адреса для машин. resource "nubes_vc_nsxt_snat" "snat" { + # UUID шлюза, созданного выше nsxt_uid = nubes_vc_nsxt.edge.id ip_space_name = var.ip_space_name + # при destroy: false — SNAT выключается (no-needed); true — оставить как есть + keep_on_destroy = false + + # ipSpace должен быть уже выделен на организации depends_on = [nubes_vc_org_ip_allocation.org_ip] } -output "vdc_id" { - value = nubes_vc_vdc.vdc.id +output "allocated_org_ip" { + description = "Внешние IP, выделенные на организации" + value = { + organization = var.organization + ip_space_name = var.ip_space_name + ip_count = var.ip_count + } } -output "nsxt_id" { - value = nubes_vc_nsxt.edge.id +output "snat_ip_space" { + description = "ipSpace, включённый как SNAT на шлюзе" + value = nubes_vc_nsxt_snat.snat.ip_space_name } diff --git a/fullpipe_chain/outputs.tf b/fullpipe_chain/outputs.tf new file mode 100644 index 0000000..d2fcf4b --- /dev/null +++ b/fullpipe_chain/outputs.tf @@ -0,0 +1,32 @@ +# Значения, нужные для дальнейшей работы (например, чтобы привязать к шлюзу +# кластер Штурвал или другие услуги). + +output "vdc_id" { + description = "UUID созданного vDC" + value = nubes_vc_vdc.vdc.id +} + +output "vdc_name" { + description = "Имя vDC" + value = nubes_vc_vdc.vdc.resource_name +} + +output "nsxt_id" { + description = "UUID созданного Edge (сетевого шлюза периметра)" + value = nubes_vc_nsxt.edge.id +} + +output "nsxt_name" { + description = "Имя Edge" + value = nubes_vc_nsxt.edge.resource_name +} + +output "vdc_state_params" { + description = "Параметры vDC из API (что реально создалось)" + value = nubes_vc_vdc.vdc.state_params +} + +output "nsxt_state_params" { + description = "Параметры Edge из API (что реально создалось)" + value = nubes_vc_nsxt.edge.state_params +} diff --git a/fullpipe_chain/provider.tf b/fullpipe_chain/provider.tf new file mode 100644 index 0000000..3a523ae --- /dev/null +++ b/fullpipe_chain/provider.tf @@ -0,0 +1,6 @@ +# Подключение к API Nubes. +# Токен и адрес API берутся из terraform.tfvars (переменные api_token, api_endpoint). +provider "nubes" { + api_token = var.api_token + api_endpoint = var.api_endpoint +} diff --git a/fullpipe_chain/terraform.tfvars.example b/fullpipe_chain/terraform.tfvars.example index 6e5eba6..4c6f6e0 100644 --- a/fullpipe_chain/terraform.tfvars.example +++ b/fullpipe_chain/terraform.tfvars.example @@ -1,9 +1,53 @@ -# Скопируйте в terraform.tfvars и заполните значениями из ЛК. +# ============================================================================= +# Шаблон значений для fullpipe_chain. +# +# 1. Скопируйте файл: cp terraform.tfvars.example terraform.tfvars +# 2. Заполните значения ниже (откуда брать — в комментариях и в README.md). +# 3. terraform.tfvars НЕ публикуйте и не коммитьте: в нём токен доступа. +# ============================================================================= -api_token = "eyJhbGciOi..." # ЛК → Профиль → Токены → «Технический» +# ЛК → Профиль → Токены → «Технический» +api_token = "eyJhbGciOi..." -organization = "organ" # имя организации из ЛК -org_uid = "57eeacd1-dc7f-4a52-b903-7e5f7d3c1164" # UUID той же организации +# Название услуги «Организация в Cloud Director» в ЛК (например: organ). +# Организацию создайте заранее в ЛК — Terraform её не создаёт и не удаляет. +organization = "organ" -ip_space_name = "internet-ipv4-v1" # имя ipSpace организации -ip_count = "3" # сколько внешних IP выделить (строка) +# Имя ipSpace для внешнего IP. Смотреть в ЛК в карточке организации. +ip_space_name = "internet-ipv4-v1" +# Сколько внешних IP выделить (строкой). +ip_count = "3" + +# --- vDC (виртуальный датацентр) --- + +# Имя vDC в ЛК — любое. +vdc_resource_name = "fullpipe-vdc" +# ЛК → создание vDC → «Сетевой провайдер» +vdc_network_provider = "snb1" +# ЛК → создание vDC → «Provider VDC» +vdc_provider_vdc = "Intel Broadwell 2.4" +# vCPU, шт. +vdc_cpu_allocated = 8 +# Резервирование vCPU, %: допустимы 0, 50 или 80 +vdc_cpu_guaranteed = 0 +# RAM, ГБ +vdc_mem_allocated = 32 +# Дисковая политика: JSON-массив, name — имя политики из ЛК, size — размер в ГБ. +# Пример: политика SATA, 200 ГБ. +vdc_storage_config = "[{\"name\":\"SATA\",\"size\":\"200\"}]" + +# --- Edge (сетевой шлюз периметра) --- + +# Имя Edge в ЛК — любое. +nsxt_resource_name = "fullpipe-edge" +# Родительская услуга: vdc или vdcGroup. +nsxt_vdc_type = "vdc" +# Балансировщик AVI (ALB). +nsxt_need_enable_avi = true +# Виртуальных сервисов AVI: 1..4. Для кластера Штурвал нужно не меньше 3. +nsxt_virtual_services_count = 3 +# Адресный пул routed-сети шлюза. Маска /24 обязательна. +nsxt_ip_addr_pool = "10.10.102.0/24" +# DNS для машин за шлюзом. +nsxt_main_dns = "81.22.46.22" +nsxt_second_dns = "185.247.187.77" diff --git a/fullpipe_chain/variables.tf b/fullpipe_chain/variables.tf new file mode 100644 index 0000000..25bbb53 --- /dev/null +++ b/fullpipe_chain/variables.tf @@ -0,0 +1,123 @@ +# ============================================================================= +# Переменные. Все значения задаются в terraform.tfvars. +# Шаблон файла: terraform.tfvars.example (скопируйте в terraform.tfvars). +# Где взять каждое значение — в описании переменной и в README.md. +# ============================================================================= + +variable "api_token" { + type = string + sensitive = true + description = "Токен API. ЛК → Профиль → Токены → «Технический». Никому не передавайте: токен даёт полный доступ к услугам." +} + +variable "api_endpoint" { + type = string + default = "https://lk-api-gateway-dev.ngcloud.ru/api/v1/svc" + description = "Адрес API. Менять не нужно." +} + +# --- Организация --- + +variable "organization" { + type = string + description = "Название услуги «Организация в Cloud Director» в ЛК (например: organ). Можно указать и её UUID. Организация создаётся заранее в ЛК — Terraform её не создаёт." +} + +variable "ip_space_name" { + type = string + description = "Имя ipSpace для внешнего IP. Смотреть в ЛК в карточке организации (например: internet-ipv4-v1)." +} + +variable "ip_count" { + type = string + default = "3" + description = "Сколько внешних IP выделить на организации. Строкой — так его отдаёт платформа." +} + +# --- vDC (виртуальный датацентр) --- + +variable "vdc_resource_name" { + type = string + default = "fullpipe-vdc" + description = "Имя vDC в ЛК. Любое, удобное вам." +} + +variable "vdc_network_provider" { + type = string + default = null + description = "Сетевой провайдер vDC. Взять в ЛК на странице создания vDC (например: snb1)." +} + +variable "vdc_provider_vdc" { + type = string + default = null + description = "Provider VDC. Взять в ЛК на странице создания vDC (например: Intel Broadwell 2.4)." +} + +variable "vdc_cpu_allocated" { + type = number + default = 8 + description = "vCPU, шт." +} + +variable "vdc_cpu_guaranteed" { + type = number + default = 0 + description = "Резервирование vCPU, %. Допустимы только 0, 50 или 80." +} + +variable "vdc_mem_allocated" { + type = number + default = 32 + description = "RAM, ГБ." +} + +variable "vdc_storage_config" { + type = string + default = "[{\"name\":\"SATA\",\"size\":\"200\"}]" + description = "Дисковая политика: JSON-массив, name — имя политики из ЛК, size — размер в ГБ (строкой). Имя политики должно существовать в ресурсном пуле (например: SATA, SSD)." +} + +# --- Edge (сетевой шлюз периметра, vc_nsxt) --- + +variable "nsxt_resource_name" { + type = string + default = "fullpipe-edge" + description = "Имя Edge в ЛК. Любое, удобное вам." +} + +variable "nsxt_vdc_type" { + type = string + default = "vdc" + description = "Тип родительской услуги: vdc (нужен vdc_uid) или vdcGroup." +} + +variable "nsxt_need_enable_avi" { + type = bool + default = true + description = "Включить балансировщик AVI (ALB)." +} + +variable "nsxt_virtual_services_count" { + type = number + default = 3 + description = "Количество виртуальных сервисов на AVI: 1..4. Для кластера Штурвал нужно не меньше 3." +} + +variable "nsxt_ip_addr_pool" { + type = string + default = "10.10.102.0/24" + description = "Адресный пул routed-сети шлюза. Маска /24 обязательна." +} + +variable "nsxt_main_dns" { + type = string + default = "81.22.46.22" + description = "Основной DNS для машин за шлюзом." +} + +variable "nsxt_second_dns" { + type = string + default = "185.247.187.77" + description = "Второй DNS для машин за шлюзом." +} diff --git a/fullpipe_chain/vdc.tf b/fullpipe_chain/vdc.tf index fb4f29c..c5f366d 100644 --- a/fullpipe_chain/vdc.tf +++ b/fullpipe_chain/vdc.tf @@ -1,19 +1,27 @@ -# Виртуальный датацентр (vDC) +# Виртуальный датацентр (vDC) — создаётся внутри организации из terraform.tfvars. resource "nubes_vc_vdc" "vdc" { - resource_name = "fullpipe-vdc" + # имя услуги в ЛК (любое, удобное вам) + resource_name = var.vdc_resource_name - # организация из ЛК (имя или UUID) + # организация, к которой привязан vDC: название услуги из ЛК или её UUID organization_uid = var.organization - # значения из ЛК: страница vDC → сетевой провайдер / Provider VDC / дисковые политики - network_provider = "snb1" - provider_vdc = "Intel Broadwell 2.4" + # значения из ЛК со страницы создания vDC + network_provider = var.vdc_network_provider + provider_vdc = var.vdc_provider_vdc - cpu_allocated = 8 - cpu_guaranteed = 0 - mem_allocated = 32 + # квоты: vCPU (шт.), резервирование vCPU (%), RAM (ГБ) + # для cpu_guaranteed допустимы только 0, 50 или 80 + cpu_allocated = var.vdc_cpu_allocated + cpu_guaranteed = var.vdc_cpu_guaranteed + mem_allocated = var.vdc_mem_allocated - storage_config = jsonencode([{ name = "SATA", size = "200" }]) + # дисковые политики: JSON-массив, name — имя политики из ЛК, size — размер в ГБ + storage_config = var.vdc_storage_config + # при destroy не удалять vDC, а приостановить (данные сохраняются) suspend_on_destroy = true + + # если услуга с таким именем уже есть — подключиться к ней, а не падать с ошибкой + adopt_existing_on_create = true } diff --git a/fullpipe_chain/versions.tf b/fullpipe_chain/versions.tf new file mode 100644 index 0000000..193f90d --- /dev/null +++ b/fullpipe_chain/versions.tf @@ -0,0 +1,12 @@ +# Версия Terraform и провайдера Nubes. +# Провайдер скачается сам при `terraform init` — вручную ставить ничего не нужно. +terraform { + required_version = ">= 1.5.0" + + required_providers { + nubes = { + source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" + version = "2.0.21" + } + } +} diff --git a/modify_resources/README.md b/modify_resources/README.md index c8eda22..23f2645 100644 --- a/modify_resources/README.md +++ b/modify_resources/README.md @@ -1,45 +1,46 @@ -# Ресурсы-модификаторы: аллокация IP на орге + SNAT на шлюзе +# Внешние IP на организации и SNAT на шлюзе -Пример показывает два ресурса, которые выполняют операции `modify` над **уже существующими** -услугами (создаются один раз вручную в ЛК): +Два ресурса, которые работают с **уже существующими** услугами (создаются вручную в ЛК): -| Ресурс | Что делает | Параметр операции | -|---|---|---| -| `nubes_vc_org_ip_allocation` | выделяет внешние IP на организации Cloud Director | `vIPConfigure` (replace массива) | -| `nubes_vc_nsxt_snat` | включает/выключает SNAT на сетевом шлюзе периметра | `ipSpaceName` (`no-needed` = выключено) | +| Ресурс | Что делает | +|---|---| +| `nubes_vc_org_ip_allocation` | выделяет внешние IP на организации | +| `nubes_vc_nsxt_snat` | включает SNAT на сетевом шлюзе | -## Зачем они нужны +Если нужно поднять всё сразу (vDC + шлюз + IP + SNAT), смотрите соседний пример `fullpipe_chain`. -В схеме ресурсов-инстансов (`nubes_vc_org`, `nubes_vc_nsxt`) эти параметры есть только в операции -`modify`, а `create` их не отправляет. Поэтому «одним ресурсом» цепочку не собрать: отдельные -ресурсы нужны, чтобы всё поднималось **в одном `apply`** и в правильном порядке. +**Перед началом:** нужен установленный Terraform 1.5 или новее. Версия провайдера указана в `main.tf` — +при `terraform init` он скачается из реестра автоматически. ## Что нужно заполнить -| Переменная | Где брать | -|---|---| -| `api_token` | ЛК → Профиль → Токены → «Технический» | -| `org_uid` | UUID услуги «Организация в Cloud Director» (из URL карточки услуги в ЛК) | -| `nsxt_uid` | UUID услуги «Сетевой шлюз периметра (Edge)» | -| `ip_space_name` | Имя ipSpace, доступное организации (например `internet-ipv4-v1`) | -| `ip_count` | Сколько внешних IP выделить (например `3`) | +```bash +cp terraform.tfvars.example terraform.tfvars +``` -## Порядок и зависимости +| Переменная | Где взять | Пример | +|---|---|---| +| `api_token` | ЛК → Профиль → Токены → «Технический» | `eyJhbGciOi...` | +| `organization` | название услуги «Организация в Cloud Director» в ЛК | `organ` | +| `nsxt_uid` | UUID услуги «Сетевой шлюз периметра (Edge)» из карточки услуги | `0000…` | +| `ip_space_name` | имя ipSpace, доступное организации | `internet-ipv4-v1` | +| `ip_count` | сколько внешних IP выделить (строкой) | `3` | -`nubes_vc_nsxt_snat` **обязан** зависеть от `nubes_vc_org_ip_allocation`: имя ipSpace берётся из -аллокации организации. В примере это явный `depends_on`. - -## Удаление (destroy) - -- `nubes_vc_org_ip_allocation` — отправляет обратный `modify` с `count=0` (квота обнуляется); -- `nubes_vc_nsxt_snat` — отправляет `ipSpaceName = "no-needed"` (SNAT выключается). - -Если снимать не нужно — поставь `keep_on_destroy = true`. +`terraform.tfvars` с токеном никому не передавайте и не коммитьте в git. ## Запуск ```bash -terraform init -terraform plan -terraform apply +terraform init # один раз — скачает провайдер +terraform plan # покажет, что будет создано +terraform apply # создаст (подтвердить: yes) ``` + +## Удаление + +```bash +terraform destroy +``` + +SNAT выключается, квота IP обнуляется. Сами услуги (организация, шлюз) не удаляются. +Если снимать не нужно — поставьте `keep_on_destroy = true`. diff --git a/modify_resources/main.tf b/modify_resources/main.tf index fa9034b..6974485 100644 --- a/modify_resources/main.tf +++ b/modify_resources/main.tf @@ -2,7 +2,7 @@ terraform { required_providers { nubes = { source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-dev/nubes" - version = "2.0.13" + version = "2.0.21" } } } @@ -18,15 +18,15 @@ variable "api_token" { description = "Nubes API token" } -# Организация и шлюз создаются один раз вручную в ЛК и адресуются по uid. -variable "org_uid" { +# Организация и шлюз создаются один раз вручную в ЛК. +variable "organization" { type = string - description = "UUID услуги «Организация в Cloud Director»" + description = "Название услуги «Организация в Cloud Director» в ЛК (например: organ). Можно указать и её UUID." } variable "nsxt_uid" { type = string - description = "UUID услуги «Сетевой шлюз периметра (Edge)»" + description = "UUID услуги «Сетевой шлюз периметра (Edge)» — из карточки услуги в ЛК." } variable "ip_space_name" { @@ -40,16 +40,12 @@ variable "ip_count" { description = "Сколько внешних IP выделить на организации" } -# ============================================================================= -# 1. Аллокация внешних IP на организации (modify: vIPConfigure) -# -# Значение replace-семантики: массив перезаписывается ЦЕЛИКОМ, поэтому этот ресурс -# владеет всей аллокацией, а не отдельным элементом. -# ============================================================================= - +# Внешние IP на организации resource "nubes_vc_org_ip_allocation" "this" { - org_uid = var.org_uid + # организация из ЛК (имя или UUID) + organization = var.organization + # сколько IP выделить: name — имя ipSpace, count — количество (строкой) vip_configure = jsonencode([ { name = var.ip_space_name @@ -57,23 +53,21 @@ resource "nubes_vc_org_ip_allocation" "this" { } ]) - # Не снимать квоту при destroy (по умолчанию false — снимается: count=0). + # при destroy: false — квота обнуляется (count=0); true — оставить как есть keep_on_destroy = false } -# ============================================================================= -# 2. SNAT на шлюзе периметра (modify: ipSpaceName) -# -# Зависит от аллокации: имя ipSpace должно быть выделено на организации. -# Значение "no-needed" выключает SNAT. -# ============================================================================= - +# SNAT на шлюзе: внешние адреса для машин +# (при destroy отправляется ipSpaceName = "no-needed", SNAT выключается) resource "nubes_vc_nsxt_snat" "this" { + # UUID шлюза (из карточки услуги в ЛК) nsxt_uid = var.nsxt_uid ip_space_name = var.ip_space_name + # при destroy: false — SNAT выключается; true — оставить как есть keep_on_destroy = false + # ipSpace сначала должен быть выделен на организации depends_on = [nubes_vc_org_ip_allocation.this] } diff --git a/modify_resources/terraform.tfvars.example b/modify_resources/terraform.tfvars.example index e78ddf3..8090407 100644 --- a/modify_resources/terraform.tfvars.example +++ b/modify_resources/terraform.tfvars.example @@ -1,8 +1,10 @@ -# Скопировать в terraform.tfvars и заполнить. +# Скопируйте файл в terraform.tfvars и заполните значениями из ЛК. +# terraform.tfvars не публикуйте и не коммитьте: в нём токен доступа. -api_token = "eyJ..." # ЛК → Профиль → Токены → «Технический» -org_uid = "df5ec5f2-0000-0000-0000-000000000000" # UUID услуги «Организация в Cloud Director» -nsxt_uid = "ad0ab577-0000-0000-0000-000000000000" # UUID услуги «Сетевой шлюз периметра (Edge)» +api_token = "eyJhbGciOi..." # ЛК → Профиль → Токены → «Технический» + +organization = "organ" # название услуги «Организация в Cloud Director» в ЛК +nsxt_uid = "00000000-0000-0000-0000-000000000000" # UUID шлюза из карточки услуги в ЛК ip_space_name = "internet-ipv4-v1" ip_count = "3"