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.4 KiB
План внедрения: локальная проверка целостности поставки terraform
Дата: 2026-09-03
Проблема
Нужно проверить целостность поставки terraform/ средствами terraform, но terraform validate/plan с реальным провайдером vkcs недостижимы в этом окружении (см. предыдущие изменения): реестр registry.terraform.io блокирует регион ("Content not available in your region"), а сконфигурированное зеркало terraform-mirror.mcs.mail.ru не содержит провайдер hashicorp/vkcs (404 на index.json) — в репозитории также исторически отсутствует блок required_providers. Пользователь подтвердил: тесты строго локальные, настройку облачных сущностей не выполняем.
Требуется: установить terraform в изолированное локальное окружение (venv/ в корне проекта), внутри — Python virtualenv с пакетами для тестов, и выполнить содержательную офлайн-проверку поставки.
Шаги
python3 -m venv venvв корне проекта.- Скачать бинарь
terraform(v1.16.1, linux_amd64) с внутреннего зеркалаhttps://hashicorp-releases.mcs.mail.ru/terraform/, проверить SHA256SUMS, распаковать вvenv/bin/terraform. (Это зеркало официальных релизов HashiCorp — провайдерvkcsтам не публикуется, т.к. это сторонний провайдер VK Cloud, не HashiCorp; проблема с провайдером этим не решается, но самterraformCLI теперь изолированно установлен в venv, как и просил пользователь.) venv/bin/pip install -r terraform/tests/requirements.txt—pytest,python-hcl2,checkov(checkov оставлен как smoke-проверка; у него нет собственных правил для провайдераvkcs, что подтверждено отдельным sanity-тестом наaws_s3_bucket).- Написать
terraform/tests/test_terraform_delivery.py— pytest-сьют, полностью офлайн:- наличие обязательных файлов поставки;
terraform fmt -check -recursive(единственная проверка, буквально использующая сам terraform-бинарь);- валидность HCL всех
.tf-файлов черезpython-hcl2; - переменные
router_count/private_interface_countобъявлены с ожидаемыми дефолтами и не переопределены вterraform.tfvars(иначеTF_VAR_*не сработает); vkcs_compute_instance.routerиспользуетcount = var.router_count, отсутствуют легаси-ресурсыrouter1/router2/lan_port1/lan_port2;locals.private_rolesгенерируется изvar.private_interface_count,dynamic "network"используетlocal.private_roles;- нарезка приватных подсетей (
cidrsubnet) не даёт коллизий — переиспользована черезipaddressдля нескольких комбинацийrouter_count/private_interface_count; network-init.sh.tplсодержит только ожидаемые Terraform-интерполяции (${pi.cidr},${pi.name}), директиву%{ for pi in private_interfaces }, и рендерится в синтаксически валидный bash (симуляцияtemplatefile()+bash -n).
.gitignore— добавитьvenv/,.pytest_cache/,__pycache__/,.terraform/,*.tfstate*(венв и кэши не должны попасть в git).README.md— короткий раздел про запуск тестов.- Summary-документ по завершении.
Верификация
venv/bin/pytest terraform/tests -v— все тесты должны быть зелёными.