diff --git a/fullpipe_chain/README.md b/fullpipe_chain/README.md new file mode 100644 index 0000000..b29ac0e --- /dev/null +++ b/fullpipe_chain/README.md @@ -0,0 +1,66 @@ +# vDC → Edge → внешние IP → SNAT + +Поднимает сетевую основу: виртуальный датацентр, сетевой шлюз периметра, внешние IP на организации +и SNAT на шлюзе. **Кластер Штурвал сюда не входит** — он разворачивается очень долго, отдельным шагом. + +Организацию создайте заранее в ЛК — в Terraform она не создаётся. + +## 1. Возьмите значения в ЛК + +| Что | Где взять | Пример | +|---|---|---| +| Токен 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` | + +## 2. Заполните terraform.tfvars + +```bash +cp terraform.tfvars.example terraform.tfvars +``` + +```hcl +api_token = "eyJhbGciOi..." # токен из шага 1 +organization = "organ" # имя организации +org_uid = "57eeacd1-dc7f-4a52-b903-7e5f7d3c1164" # UUID организации +ip_space_name = "internet-ipv4-v1" +ip_count = "3" +``` + +## 3. Выполните команды + +```bash +terraform init # один раз — скачает провайдер +terraform plan # покажет, что будет создано +terraform apply # создаст (подтвердить: yes) +``` + +## 4. Проверьте результат + +- в ЛК появились виртуальный датацентр и сетевой шлюз; +- на организации выделены внешние IP; +- на шлюзе включён SNAT; +- `terraform plan` повторно не показывает изменений. + +## 5. Удаление + +```bash +terraform destroy +``` + +Порядок обратный: SNAT выключается, квота IP обнуляется, затем удаляются шлюз и vDC. +**Организация не удаляется.** + +## Состав файлов + +| Файл | Что делает | +|---|---| +| `main.tf` | провайдер и переменные | +| `vdc.tf` | виртуальный датацентр | +| `edge.tf` | сетевой шлюз периметра (Edge) | +| `modifiers.tf` | внешние IP на организации + SNAT на шлюзе | +| `terraform.tfvars.example` | шаблон значений из ЛК | diff --git a/fullpipe_chain/edge.tf b/fullpipe_chain/edge.tf new file mode 100644 index 0000000..71f1aa9 --- /dev/null +++ b/fullpipe_chain/edge.tf @@ -0,0 +1,16 @@ +# Сетевой шлюз периметра (Edge) +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" + } +} diff --git a/fullpipe_chain/main.tf b/fullpipe_chain/main.tf new file mode 100644 index 0000000..c34f693 --- /dev/null +++ b/fullpipe_chain/main.tf @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..98cd7b3 --- /dev/null +++ b/fullpipe_chain/modifiers.tf @@ -0,0 +1,30 @@ +# Внешние IP на организации (создаётся после Edge) +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 + } + ]) + + depends_on = [nubes_vc_nsxt.edge] +} + +# SNAT на шлюзе этим ipSpace. +# При удалении отправляется ipSpaceName = "no-needed" (SNAT выключается). +resource "nubes_vc_nsxt_snat" "snat" { + nsxt_uid = nubes_vc_nsxt.edge.id + ip_space_name = var.ip_space_name + + depends_on = [nubes_vc_org_ip_allocation.org_ip] +} + +output "vdc_id" { + value = nubes_vc_vdc.vdc.id +} + +output "nsxt_id" { + value = nubes_vc_nsxt.edge.id +} diff --git a/fullpipe_chain/terraform.tfvars.example b/fullpipe_chain/terraform.tfvars.example new file mode 100644 index 0000000..6e5eba6 --- /dev/null +++ b/fullpipe_chain/terraform.tfvars.example @@ -0,0 +1,9 @@ +# Скопируйте в terraform.tfvars и заполните значениями из ЛК. + +api_token = "eyJhbGciOi..." # ЛК → Профиль → Токены → «Технический» + +organization = "organ" # имя организации из ЛК +org_uid = "57eeacd1-dc7f-4a52-b903-7e5f7d3c1164" # UUID той же организации + +ip_space_name = "internet-ipv4-v1" # имя ipSpace организации +ip_count = "3" # сколько внешних IP выделить (строка) diff --git a/fullpipe_chain/vdc.tf b/fullpipe_chain/vdc.tf new file mode 100644 index 0000000..fb4f29c --- /dev/null +++ b/fullpipe_chain/vdc.tf @@ -0,0 +1,19 @@ +# Виртуальный датацентр (vDC) +resource "nubes_vc_vdc" "vdc" { + resource_name = "fullpipe-vdc" + + # организация из ЛК (имя или UUID) + organization_uid = var.organization + + # значения из ЛК: страница vDC → сетевой провайдер / Provider VDC / дисковые политики + network_provider = "snb1" + provider_vdc = "Intel Broadwell 2.4" + + cpu_allocated = 8 + cpu_guaranteed = 0 + mem_allocated = 32 + + storage_config = jsonencode([{ name = "SATA", size = "200" }]) + + suspend_on_destroy = true +}