docs: примеры DNS-зон и записей (карта зон + N зон в цикле)
This commit is contained in:
Generated
+10
@@ -0,0 +1,10 @@
|
||||
# This file is maintained automatically by "terraform init".
|
||||
# Manual edits may be lost in future updates.
|
||||
|
||||
provider "tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes" {
|
||||
version = "3.4.0"
|
||||
constraints = "3.4.0"
|
||||
hashes = [
|
||||
"h1:7wpWUTAHpddZXHiecwezW5qaNq17WJLTEnE/kF8lNN4=",
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
# N DNS-зон, сгенерированных программно (в цикле)
|
||||
|
||||
Пример-близнец `../dns_zones/`, но здесь зоны **не задаются вручную**, а
|
||||
генерируются из числа `var.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 = ... }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Удобно, когда зон много и они однотипны (напр. 10 зон `tfzone-1 … tfzone-10`).
|
||||
|
||||
## Ресурсы
|
||||
|
||||
| Ресурс | Сервис | Назначение |
|
||||
|---|---|---|
|
||||
| `nubes_zones_v2` | 109 | DNS-зона |
|
||||
| `nubes_zones_v2_record` | подресурс зоны | Запись внутри зоны (A / CNAME / …) |
|
||||
|
||||
## Разница с `../dns_zones/`
|
||||
|
||||
| | `dns_zones` | `dns_zones_generated` |
|
||||
|---|---|---|
|
||||
| Источник зон | явная карта `var.zones` | `range(1, zone_count+1)` в `locals` |
|
||||
| Когда удобно | разный набор зон/записей | много однотипных зон |
|
||||
|
||||
## Как запустить
|
||||
|
||||
```bash
|
||||
cp terraform.tfvars.example terraform.tfvars # при желании: zone_count = N
|
||||
# api_token — в secrets.auto.tfvars (НЕ в terraform.tfvars!)
|
||||
terraform init
|
||||
terraform plan
|
||||
terraform apply # запускает пользователь
|
||||
```
|
||||
|
||||
## Проверки
|
||||
|
||||
- После `apply` повторный `plan` должен давать `No changes`.
|
||||
- Изменение `zone_count` добавляет/убирает зоны (стабильные адреса `for_each`).
|
||||
- Чтобы зоны работали в интернете, домен у регистратора надо делегировать на NS
|
||||
`ns3.ngcloud.ru` / `ns4.ngcloud.ru`.
|
||||
@@ -0,0 +1,54 @@
|
||||
# =============================================================================
|
||||
# Пример: N DNS-зон генерируются ПРОГРАММНО (в цикле) — через Terraform.
|
||||
#
|
||||
# Отличие от ../dns_zones/: там зоны заданы явной картой `var.zones`,
|
||||
# а здесь зоны генерируются из числа `var.zone_count` через `range(...)`.
|
||||
# Удобно, когда зон много и они однотипны (tfzone-1 … tfzone-N).
|
||||
#
|
||||
# Ресурсы: nubes_zones_v2 (109) + подресурс nubes_zones_v2_record (записи).
|
||||
# ⚠️ Имя поля в HCL = `name` из схемы (snake_case).
|
||||
# =============================================================================
|
||||
|
||||
locals {
|
||||
# N зон генерируются программно: tfzone-1 … tfzone-N.
|
||||
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 = { type = "A", values = ["10.0.${i}.1"] }
|
||||
api = { type = "A", values = ["10.0.${i}.2"] }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Плоская карта записей «зона:имя» (вложенный цикл → merge/flatten).
|
||||
records = merge([
|
||||
for zk, z in local.zones : {
|
||||
for rk, r in z.records :
|
||||
"${zk}:${rk}" => {
|
||||
zone = zk
|
||||
name = rk
|
||||
type = r.type
|
||||
values = r.values
|
||||
}
|
||||
}
|
||||
]...)
|
||||
}
|
||||
|
||||
# Зоны: N штук, сгенерированных в locals (for_each по ключам — стабильные адреса).
|
||||
resource "nubes_zones_v2" "zone" {
|
||||
for_each = local.zones
|
||||
resource_name = "dns-zone-${each.key}"
|
||||
zone_name = each.value.zone_name
|
||||
}
|
||||
|
||||
# Записи: record_input = [{record=<значение>}, ...] из списка values.
|
||||
resource "nubes_zones_v2_record" "record" {
|
||||
for_each = local.records
|
||||
zones_v2_id = nubes_zones_v2.zone[each.value.zone].id
|
||||
record_name = each.value.name
|
||||
record_type = each.value.type
|
||||
record_input = jsonencode([for v in each.value.values : { record = v }])
|
||||
record_ttl = 3600
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
provider "nubes" {
|
||||
api_token = var.api_token
|
||||
api_endpoint = var.api_endpoint
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
# Копировать в terraform.tfvars и подставить значения.
|
||||
# ⚠️ api_token — СЕКРЕТ: сюда НЕ класть. Держите в отдельном secrets.auto.tfvars
|
||||
# (формат: api_token = "<JWT>"). Оба файла (*.tfvars) закрыты в .gitignore.
|
||||
|
||||
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||
|
||||
# Сколько зон сгенерировать (tfzone-1 … tfzone-N):
|
||||
zone_count = 10
|
||||
zone_prefix = "tfzone"
|
||||
zone_domain = "test"
|
||||
@@ -0,0 +1,31 @@
|
||||
# Переменные примера. api_token — СЕКРЕТ, держать в secrets.auto.tfvars.
|
||||
|
||||
variable "api_token" {
|
||||
description = "Nubes API token (JWT). Секрет — в secrets.auto.tfvars."
|
||||
type = string
|
||||
sensitive = true
|
||||
}
|
||||
|
||||
variable "api_endpoint" {
|
||||
description = "API Gateway URL стенда"
|
||||
type = string
|
||||
default = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||
}
|
||||
|
||||
variable "zone_count" {
|
||||
description = "Сколько зон сгенерировать (tfzone-1 … tfzone-N)"
|
||||
type = number
|
||||
default = 10
|
||||
}
|
||||
|
||||
variable "zone_prefix" {
|
||||
description = "Префикс имени зоны"
|
||||
type = string
|
||||
default = "tfzone"
|
||||
}
|
||||
|
||||
variable "zone_domain" {
|
||||
description = "Домен зон (суффикс FQDN)"
|
||||
type = string
|
||||
default = "test"
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
terraform {
|
||||
required_version = ">= 1.5.0"
|
||||
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "tf-registry.containerk8s.services.ngcloud.ru/nubes-test/nubes"
|
||||
version = "3.4.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user