feat: пример fullpipe_chain (vDC → Edge → внешние IP → SNAT) + README с шагами
This commit is contained in:
@@ -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` | шаблон значений из ЛК |
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
@@ -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 выделить (строка)"
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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 выделить (строка)
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user