docs: дружелюбные README для примеров DNS (для пользователя)
This commit is contained in:
+56
-24
@@ -1,40 +1,72 @@
|
|||||||
# DNS-зоны и записи через Terraform
|
# DNS-зоны и записи (зоны — карта)
|
||||||
|
|
||||||
Пример: доменные зоны компании и записи в них — целиком через Terraform.
|
Управление доменными зонами и их записями через Terraform вместо личного кабинета. Зоны и записи задаются одной картой `zones`.
|
||||||
Зоны задаются картой `var.zones` (`for_each`), записи — вложенным циклом
|
|
||||||
(`flatten` + `for_each`).
|
## Что получится после `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` | DNS-зона |
|
||||||
| `nubes_zones_v2_record` | подресурс зоны | Запись внутри зоны (A / CNAME / …) |
|
| `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
|
```bash
|
||||||
cp terraform.tfvars.example terraform.tfvars # подставить api_endpoint (если нужно)
|
cd dns_zones
|
||||||
# api_token — в secrets.auto.tfvars (НЕ в terraform.tfvars!)
|
cp terraform.tfvars.example terraform.tfvars
|
||||||
|
|
||||||
|
# 1. Создайте secrets.auto.tfvars (токен — СЕКРЕТ, НЕ в terraform.tfvars):
|
||||||
|
# api_token = "<JWT>"
|
||||||
|
# JWT берётся в ЛК: Профиль → Токены.
|
||||||
|
|
||||||
terraform init
|
terraform init
|
||||||
terraform plan
|
terraform plan
|
||||||
terraform apply # запускает пользователь
|
terraform apply
|
||||||
```
|
```
|
||||||
|
|
||||||
## Проверки
|
## Как изменить зоны и записи
|
||||||
|
|
||||||
- После `apply` повторный `plan` должен давать `No changes`.
|
Всё лежит в переменной `zones` (`variables.tf` — дефолт, или переопределите в `terraform.tfvars`):
|
||||||
- Изменение значения записи → обычный `apply` (поле `record_input` модифицируемое).
|
|
||||||
- Чтобы зона работала в интернете, домен у регистратора надо делегировать на NS
|
```hcl
|
||||||
`ns3.ngcloud.ru` / `ns4.ngcloud.ru`.
|
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` (удобно для многих однотипных зон).
|
||||||
|
|||||||
@@ -1,47 +1,70 @@
|
|||||||
# N DNS-зон, сгенерированных программно (в цикле)
|
# N DNS-зон, сгенерированных циклом
|
||||||
|
|
||||||
Пример-близнец `../dns_zones/`, но здесь зоны **не задаются вручную**, а
|
То же, что `../dns_zones/`, но зоны не перечисляются руками — генерируются из одного числа `zone_count`.
|
||||||
генерируются из числа `var.zone_count`:
|
|
||||||
|
|
||||||
```hcl
|
## Что получится после `apply`
|
||||||
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 = ... }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Удобно, когда зон много и они однотипны (напр. 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` |
|
||||||
|
| … | … |
|
||||||
|
|
||||||
| Ресурс | Сервис | Назначение |
|
Адреса зависят от номера зоны: `10.0.<номер>.1` и `10.0.<номер>.2`.
|
||||||
|---|---|---|
|
|
||||||
| `nubes_zones_v2` | 109 | DNS-зона |
|
|
||||||
| `nubes_zones_v2_record` | подресурс зоны | Запись внутри зоны (A / CNAME / …) |
|
|
||||||
|
|
||||||
## Разница с `../dns_zones/`
|
## Когда этот вариант удобнее
|
||||||
|
|
||||||
|
Зон много и они однотипны (например 100 поддоменов). Вместо перечисления — одно число.
|
||||||
|
|
||||||
| | `dns_zones` | `dns_zones_generated` |
|
| | `dns_zones` | `dns_zones_generated` |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| Источник зон | явная карта `var.zones` | `range(1, zone_count+1)` в `locals` |
|
| Источник зон | карта `zones` | `range(1, zone_count + 1)` |
|
||||||
| Когда удобно | разный набор зон/записей | много однотипных зон |
|
| Когда | разный набор зон/записей | много однотипных зон |
|
||||||
|
|
||||||
## Как запустить
|
## Быстрый старт
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cp terraform.tfvars.example terraform.tfvars # при желании: zone_count = N
|
cd dns_zones_generated
|
||||||
# api_token — в secrets.auto.tfvars (НЕ в terraform.tfvars!)
|
cp terraform.tfvars.example terraform.tfvars
|
||||||
|
|
||||||
|
# 1. Создайте secrets.auto.tfvars (токен — СЕКРЕТ, НЕ в terraform.tfvars):
|
||||||
|
# api_token = "<JWT>"
|
||||||
|
# JWT берётся в ЛК: Профиль → Токены.
|
||||||
|
|
||||||
terraform init
|
terraform init
|
||||||
terraform plan
|
terraform plan
|
||||||
terraform apply # запускает пользователь
|
terraform apply
|
||||||
```
|
```
|
||||||
|
|
||||||
## Проверки
|
## Настройка
|
||||||
|
|
||||||
- После `apply` повторный `plan` должен давать `No changes`.
|
В `terraform.tfvars`:
|
||||||
- Изменение `zone_count` добавляет/убирает зоны (стабильные адреса `for_each`).
|
|
||||||
- Чтобы зоны работали в интернете, домен у регистратора надо делегировать на NS
|
| Переменная | Дефолт | Что делает |
|
||||||
`ns3.ngcloud.ru` / `ns4.ngcloud.ru`.
|
|---|---|---|
|
||||||
|
| `zone_count` | `10` | сколько зон создать |
|
||||||
|
| `zone_prefix` | `tfzone` | префикс имени |
|
||||||
|
| `zone_domain` | `test` | домен (суффикс FQDN) |
|
||||||
|
|
||||||
|
Итоговое имя зоны = `<prefix>-<i>.<domain>`, например `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`.
|
||||||
|
|||||||
Reference in New Issue
Block a user