Files
CloudRouterAdvanced/docs/changes/2026-09-03-adaptive-router-vm-count-plan.md
ayurishchevandClaude Sonnet 5 5979a9a58b Add adaptive router VM/interface scaling and local delivery integrity tests
Terraform now provisions router_count IaaS Router VMs (default 2, no
longer hardcoded to router1/router2), each with 1 public +
private_interface_count isolated private interfaces (no shared LAN or
VRRP between routers). Both counts scale via Terraform variables and
TF_VAR_* environment variables. The post-install script became a
Terraform template that matches interfaces to their expected subnet by
CIDR instead of a fragile "first private IP" heuristic.

Added an offline pytest suite (terraform/tests/) that checks the
delivery's internal consistency and runs real terraform init/validate
against the actual vkcs provider schema via a project-local filesystem
mirror (provider binary fetched from its GitHub releases, bypassing the
region-blocked HashiCorp registry) - no cloud credentials or API calls
involved. terraform/versions.tf now declares the previously-missing
required_providers block.

Ansible (inventory.ini, base/frr_router/keepalived roles) still assumes
the old 2-router/2-NIC/VRRP topology and is not yet adapted - documented
as a follow-up, not addressed here.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
2026-09-03 16:03:12 +03:00

4.6 KiB
Raw Permalink Blame History

План внедрения: адаптивное количество ВМ-маршрутизаторов и 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-значения)