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
4.6 KiB
План внедрения: адаптивное количество ВМ-маршрутизаторов и 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 — отдельный сегмент приватных серверов, не связанный с роутерами; не меняются.
Шаги
terraform/variables.tf: добавитьrouter_count,private_supernet,private_subnet_prefix_length,router_availability_zones.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().
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 на приватных).
- Экранировать существующие bash brace-expansions (
terraform.tfvars: добавить примеры значений новых переменных.README.md: обновить описание архитектуры (N роутеров, 3 NIC, без VRRP/общего LAN на роутерах), отметить, что диаграммы и Ansible-слой пока отражают старую схему.- Summary-документ по завершении.
Верификация
terraform fmt -recursiveterraform init -backend=false+terraform validate(best-effort, если провайдер VKCS доступен из окружения)- Офлайн-проверка синтаксиса
.tpl: подстановка тестовых значений вместо%{ for }-блока во временную копию +bash -n terraform plan/applyс реальными credentials — вне рамок этой сессии (создаёт платные облачные ресурсы,terraform.tfvarsсодержит placeholder-значения)