From 9731ba672f57cdaa9d7565a3e38df48a6d0f85fe Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sat, 17 Oct 2026 08:15:50 +0300 Subject: [PATCH] =?UTF-8?q?docs:=20=D0=B4=D1=80=D1=83=D0=B6=D0=B5=D0=BB?= =?UTF-8?q?=D1=8E=D0=B1=D0=BD=D1=8B=D0=B5=20README=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=D0=BE=D0=B2=20DNS=20(?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=D0=BB=D1=8F)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dns_zones/README.md | 80 +++++++++++++++++++++++---------- dns_zones_generated/README.md | 83 ++++++++++++++++++++++------------- 2 files changed, 109 insertions(+), 54 deletions(-) diff --git a/dns_zones/README.md b/dns_zones/README.md index 860be41..b313725 100644 --- a/dns_zones/README.md +++ b/dns_zones/README.md @@ -1,40 +1,72 @@ -# DNS-зоны и записи через Terraform +# DNS-зоны и записи (зоны — карта) -Пример: доменные зоны компании и записи в них — целиком через Terraform. -Зоны задаются картой `var.zones` (`for_each`), записи — вложенным циклом -(`flatten` + `for_each`). +Управление доменными зонами и их записями через Terraform вместо личного кабинета. Зоны и записи задаются одной картой `zones`. + +## Что получится после `apply` + +По умолчанию — 2 зоны, по 3 записи в каждой: + +| Зона | Записи | +|---|---| +| `tfzone-a.test` | `www` → A `10.0.0.77, 203.0.113.14` · `api` → A · `cdn` → CNAME `www.tfzone-a.test.` | +| `tfzone-b.test` | `www` → A · `api` → A · `cdn` → CNAME | ## Ресурсы -| Ресурс | Сервис | Назначение | -|---|---|---| -| `nubes_zones_v2` | 109 | DNS-зона | -| `nubes_zones_v2_record` | подресурс зоны | Запись внутри зоны (A / CNAME / …) | +| Ресурс | Что делает | +|---|---| +| `nubes_zones_v2` | DNS-зона | +| `nubes_zones_v2_record` | запись внутри зоны (`A`, `CNAME`, `TXT`, …) | -## Что в конфиге +Запись — отдельный ресурс, поэтому одну запись можно изменить или удалить, не трогая зону целиком. -- N зон из `var.zones` (по умолчанию 2: `tfzone-a.test`, `tfzone-b.test`); -- по 3 записи в каждой зоне (`A`, `A`, `CNAME`). - -Чтобы добавить/убрать зону или запись — правьте `var.zones`, затем `apply`. - -## Как запустить +## Быстрый старт ```bash -cp terraform.tfvars.example terraform.tfvars # подставить api_endpoint (если нужно) -# api_token — в secrets.auto.tfvars (НЕ в terraform.tfvars!) +cd dns_zones +cp terraform.tfvars.example terraform.tfvars + +# 1. Создайте secrets.auto.tfvars (токен — СЕКРЕТ, НЕ в terraform.tfvars): +# api_token = "" +# JWT берётся в ЛК: Профиль → Токены. + terraform init terraform plan -terraform apply # запускает пользователь +terraform apply ``` -## Проверки +## Как изменить зоны и записи -- После `apply` повторный `plan` должен давать `No changes`. -- Изменение значения записи → обычный `apply` (поле `record_input` модифицируемое). -- Чтобы зона работала в интернете, домен у регистратора надо делегировать на NS - `ns3.ngcloud.ru` / `ns4.ngcloud.ru`. +Всё лежит в переменной `zones` (`variables.tf` — дефолт, или переопределите в `terraform.tfvars`): + +```hcl +zones = { + a = { + zone_name = "tfzone-a.test" + records = { + www = { type = "A", values = ["10.0.0.77", "203.0.113.14"] } # одно имя → несколько адресов + cdn = { type = "CNAME", values = ["www.tfzone-a.test."] } # CNAME — с точкой на конце + } + } +} +``` + +Правила, которые сэкономят время: + +- **Ключ карты** (`a`, `b`, `www`…) — это адрес объекта в state. Смена ключа = «удалить + создать заново», а не «переименовать». Значение (`zone_name`, `values`) меняйте свободно. +- **Несколько адресов** у одной записи — это один ресурс, а не несколько. +- **`CNAME` пишется с точкой на конце** (`www.example.com.`), иначе платформа припишет домен зоны. + +## Допустимые типы записей + +`A`, `AAAA`, `CNAME`, `MX`, `SRV`, `TXT`, `LUA`, `NS`, `SSHFP`. + +## Важно + +- **Токен** — только в `secrets.auto.tfvars` (файл в `.gitignore`). Никогда не коммитить. +- **Чтобы зона работала в интернете**, у регистратора делегируйте домен на NS `ns3.ngcloud.ru` / `ns4.ngcloud.ru`. +- **Проверка**: после `apply` повторный `terraform plan` должен дать `No changes`. ## См. также -- `../dns_zones_generated/` — тот же сценарий, но N зон генерируются программно. +`../dns_zones_generated/` — тот же сценарий, но зоны генерируются циклом из одного числа `zone_count` (удобно для многих однотипных зон). diff --git a/dns_zones_generated/README.md b/dns_zones_generated/README.md index b2a9e5f..252d5c9 100644 --- a/dns_zones_generated/README.md +++ b/dns_zones_generated/README.md @@ -1,47 +1,70 @@ -# N DNS-зон, сгенерированных программно (в цикле) +# N DNS-зон, сгенерированных циклом -Пример-близнец `../dns_zones/`, но здесь зоны **не задаются вручную**, а -генерируются из числа `var.zone_count`: +То же, что `../dns_zones/`, но зоны не перечисляются руками — генерируются из одного числа `zone_count`. -```hcl -zones = { - for i in range(1, var.zone_count + 1) : - "${var.zone_prefix}-${i}" => { - zone_name = "${var.zone_prefix}-${i}.${var.zone_domain}" - records = { www = ..., api = ... } - } -} -``` +## Что получится после `apply` -Удобно, когда зон много и они однотипны (напр. 10 зон `tfzone-1 … tfzone-10`). +По умолчанию — 10 зон `tfzone-1.test … tfzone-10.test`, по 2 записи в каждой: -## Ресурсы +| Зона | Записи | +|---|---| +| `tfzone-1.test` | `www` → A `10.0.1.1` · `api` → A `10.0.1.2` | +| `tfzone-2.test` | `www` → A `10.0.2.1` · `api` → A `10.0.2.2` | +| … | … | -| Ресурс | Сервис | Назначение | -|---|---|---| -| `nubes_zones_v2` | 109 | DNS-зона | -| `nubes_zones_v2_record` | подресурс зоны | Запись внутри зоны (A / CNAME / …) | +Адреса зависят от номера зоны: `10.0.<номер>.1` и `10.0.<номер>.2`. -## Разница с `../dns_zones/` +## Когда этот вариант удобнее + +Зон много и они однотипны (например 100 поддоменов). Вместо перечисления — одно число. | | `dns_zones` | `dns_zones_generated` | |---|---|---| -| Источник зон | явная карта `var.zones` | `range(1, zone_count+1)` в `locals` | -| Когда удобно | разный набор зон/записей | много однотипных зон | +| Источник зон | карта `zones` | `range(1, zone_count + 1)` | +| Когда | разный набор зон/записей | много однотипных зон | -## Как запустить +## Быстрый старт ```bash -cp terraform.tfvars.example terraform.tfvars # при желании: zone_count = N -# api_token — в secrets.auto.tfvars (НЕ в terraform.tfvars!) +cd dns_zones_generated +cp terraform.tfvars.example terraform.tfvars + +# 1. Создайте secrets.auto.tfvars (токен — СЕКРЕТ, НЕ в terraform.tfvars): +# api_token = "" +# JWT берётся в ЛК: Профиль → Токены. + terraform init terraform plan -terraform apply # запускает пользователь +terraform apply ``` -## Проверки +## Настройка -- После `apply` повторный `plan` должен давать `No changes`. -- Изменение `zone_count` добавляет/убирает зоны (стабильные адреса `for_each`). -- Чтобы зоны работали в интернете, домен у регистратора надо делегировать на NS - `ns3.ngcloud.ru` / `ns4.ngcloud.ru`. +В `terraform.tfvars`: + +| Переменная | Дефолт | Что делает | +|---|---|---| +| `zone_count` | `10` | сколько зон создать | +| `zone_prefix` | `tfzone` | префикс имени | +| `zone_domain` | `test` | домен (суффикс FQDN) | + +Итоговое имя зоны = `-.`, например `tfzone-3.test`. + +## Как поменять набор записей + +Записи заданы шаблоном в `locals.zones` (`main.tf`). По умолчанию `www` и `api`. Добавить/убрать — правьте блок `records`: + +```hcl +records = { + www = { type = "A", values = ["10.0.${i}.1"] } + api = { type = "A", values = ["10.0.${i}.2"] } + db = { type = "A", values = ["10.0.${i}.3"] } # добавили третью запись +} +``` + +## Важно + +- **Токен** — только в `secrets.auto.tfvars` (файл в `.gitignore`). Никогда не коммитить. +- **Чтобы зоны работали в интернете**, у регистратора делегируйте домен на NS `ns3.ngcloud.ru` / `ns4.ngcloud.ru`. +- Изменение `zone_count` добавляет/убирает зоны; ключи `for_each` стабильны — существующие зоны не пересоздаются. +- **Проверка**: после `apply` повторный `terraform plan` должен дать `No changes`.