Files
CloudRouterAdvanced/docs/changes/2026-09-03-dynamic-private-interface-count-plan.md
T
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

3.0 KiB

План внедрения: динамическое количество приватных интерфейсов

Дата: 2026-09-03

Проблема

Количество ВМ-маршрутизаторов уже параметризовано через var.router_count (см. 2026-09-03-adaptive-router-vm-count-plan.md). Количество приватных интерфейсов на роутер осталось жёстко зашито: terraform/main.tf — locals.private_roles = ["priv1", "priv2"], ровно 2 роли.

Нужна вторая ось горизонтального масштабирования: количество приватных интерфейсов на роутер тоже управляется переменной, и обе переменные (router_count, теперь и количество приватных интерфейсов) должны быть передаваемы через переменные окружения — что в Terraform уже "бесплатно" работает через TF_VAR_<имя> для любой объявленной variable, пока значение не переопределено в terraform.tfvars.

terraform/scripts/network-init.sh.tpl уже написан generic (итерация по bash-массиву PRIV_TARGETS произвольной длины) — единственный хардкод в нём это eth0 для WAN. Скрипт менять не требуется.

Шаги

  1. terraform/variables.tf: добавить private_interface_count (number, default 2, validation >= 1).
  2. terraform/main.tf: locals.private_roles = [for i in range(var.private_interface_count) : "priv${i + 1}"] вместо хардкода ["priv1", "priv2"]. Остальные блоки (router_private_subnets, router_priv_net/subnet/port, dynamic "network", генерация private_interfaces для templatefile()) уже параметризованы через local.private_roles и не требуют изменений.
  3. terraform.tfvars: закомментированный пример # private_interface_count = 3.
  4. README.md: раздел про масштабирование через TF_VAR_router_count / TF_VAR_private_interface_count, обновить формулировку "1 публичный + N приватных".
  5. Summary-документ по завершении.

Верификация

  • terraform fmt -recursive
  • terraform init -backend=false + terraform validate (best-effort, провайдер vkcs недоступен в этом окружении — известное ограничение, не связано с правкой)
  • Ручная трассировка local.private_roles/router_private_subnets для private_interface_count = 1 и = 4 — корректность и отсутствие коллизий CIDR