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
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. Скрипт менять не требуется.
Шаги
terraform/variables.tf: добавитьprivate_interface_count(number, default2, validation>= 1).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и не требуют изменений.terraform.tfvars: закомментированный пример# private_interface_count = 3.README.md: раздел про масштабирование черезTF_VAR_router_count/TF_VAR_private_interface_count, обновить формулировку "1 публичный + N приватных".- Summary-документ по завершении.
Верификация
terraform fmt -recursiveterraform init -backend=false+terraform validate(best-effort, провайдерvkcsнедоступен в этом окружении — известное ограничение, не связано с правкой)- Ручная трассировка
local.private_roles/router_private_subnetsдляprivate_interface_count = 1и= 4— корректность и отсутствие коллизий CIDR