36 lines
4.6 KiB
Markdown
36 lines
4.6 KiB
Markdown
# План внедрения: адаптивное количество ВМ-маршрутизаторов и 3 интерфейса
|
||||
|
|
|
|||
|
|
Дата: 2026-09-03
|
|||
|
|
|
|||
|
|
## Проблема
|
|||
|
|
|
|||
|
|
`terraform/main.tf` жёстко описывает ровно 2 ВМ-маршрутизатора (`router1`, `router2`) с 2 интерфейсами каждая: WAN (публичный, DHCP) и LAN (приватный, статический IP на общей сети `10.200.10.0/24`, используемой также для VRRP-VIP через keepalived). Post-install скрипт `terraform/scripts/network-init.sh` определяет эти 2 интерфейса эвристически (первый интерфейс с приватным IP → LAN, первый с публичным IP → WAN).
|
|||
|
|
|
|||
|
|
Целевая схема: адаптивное количество ВМ-маршрутизаторов (2, 3, 4 и более, управляется переменной), у каждой ВМ — 3 интерфейса: 1 публичный (WAN, без изменений) + 2 приватных, каждый в своей уникальной изолированной микросети (`/29` или `/28`, размер задаётся переменной). VRRP и общая LAN-сеть между роутерами в новой схеме не используются.
|
|||
|
|
|
|||
|
|
Изменения ограничены директорией `terraform` (включая `terraform/scripts/network-init.sh`). Ansible-слой (`ansible/inventory.ini`, роли `base`/`frr_router`/`keepalived`, которые сейчас жёстко используют `eth0`/`eth1` и только `router1`/`router2`) в этом изменении не трогается — по явному решению заказчика; несоответствие фиксируется как задел на будущее.
|
|||
|
|
|
|||
|
|
`lan_net`/`lan_subnet` (`10.200.10.0/24`) и ВМ `priv_srv_01/02/03` — отдельный сегмент приватных серверов, не связанный с роутерами; не меняются.
|
|||
|
|
|
|||
|
|
## Шаги
|
|||
|
|
|
|||
|
|
1. `terraform/variables.tf`: добавить `router_count`, `private_supernet`, `private_subnet_prefix_length`, `router_availability_zones`.
|
|||
|
|
2. `terraform/main.tf`:
|
|||
|
|
- `locals.router_private_subnets` — детерминированная нарезка CIDR из `private_supernet` на пары (router_index, role) через `cidrsubnet()`.
|
|||
|
|
- Заменить `lan_port1`/`lan_port2` на `for_each`-ресурсы (`router_priv_net`/`router_priv_subnet`/`router_priv_port`) по `local.router_private_subnets`.
|
|||
|
|
- Заменить `router1`/`router2` на один ресурс `vkcs_compute_instance.router` с `count = var.router_count`, WAN + `dynamic "network"` по приватным портам, `user_data` через `templatefile()`.
|
|||
|
|
3. `terraform/scripts/network-init.sh` → `terraform/scripts/network-init.sh.tpl`:
|
|||
|
|
- Экранировать существующие bash brace-expansions (`${netmask}` и т.п.) как `$${...}`, чтобы Terraform их не интерполировал.
|
|||
|
|
- WAN-детект — без изменений (эвристика по публичному IP).
|
|||
|
|
- Приватные интерфейсы — сопоставление по CIDR из переданного Terraform списка `private_interfaces`, а не "первый приватный IP".
|
|||
|
|
- netplan: `eth0` (WAN) как раньше + цикл по найденным приватным интерфейсам (без default route на приватных).
|
|||
|
|
4. `terraform.tfvars`: добавить примеры значений новых переменных.
|
|||
|
|
5. `README.md`: обновить описание архитектуры (N роутеров, 3 NIC, без VRRP/общего LAN на роутерах), отметить, что диаграммы и Ansible-слой пока отражают старую схему.
|
|||
|
|
6. Summary-документ по завершении.
|
|||
|
|
|
|||
|
|
## Верификация
|
|||
|
|
|
|||
|
|
- `terraform fmt -recursive`
|
|||
|
|
- `terraform init -backend=false` + `terraform validate` (best-effort, если провайдер VKCS доступен из окружения)
|
|||
|
|
- Офлайн-проверка синтаксиса `.tpl`: подстановка тестовых значений вместо `%{ for }`-блока во временную копию + `bash -n`
|
|||
|
|
- `terraform plan`/`apply` с реальными credentials — вне рамок этой сессии (создаёт платные облачные ресурсы, `terraform.tfvars` содержит placeholder-значения)
|