`terraform apply` (горизонтальное масштабирование до 4 роутеров, только `router_count = 3 → 4` в `terraform.tfvars`): **3 added, 0 changed, 0 destroyed** — только `router4` и его 2 приватных порта, остальные 3 роутера не затронуты.
| Только роутеры (без демо-сегмента) | `priv_srv_01/02/03`, `lan_net`, `private_sg` удалены из `main.tf` |
| Только Terraform, без Ansible | Ansible-плейбук не запускался (осознанное решение, зафиксировано в памяти) |
## Что пришлось исправить по пути (реальные баги, найдены при живом деплое)
1.**`provider "vkcs"` отсутствовал вовсе** — `username`/`password`/`project_id`/`region` были объявлены, но ни к чему не подключены. Добавлен provider-блок + переменные `auth_url`, `user_domain_name`.
2.**SSH-keypair не существовал под сервисным аккаунтом** (Nova keypair'ы — per-user, не per-project). Добавлен `vkcs_compute_keypair`, регистрирующий ключ из `var.ssh_public_key`.
3.**Коллизия IP на приватных портах** — ручной расчёт `fixed_ip` конфликтовал со служебным портом VKCS (`network:dns`), автоматически создаваемым в каждой сети. Убрано ручное вычисление IP — адрес назначает Neutron IPAM (гарантированно без коллизий).
4.**`image_id` на верхнем уровне ресурса ВМ при boot-from-volume** — по документации провайдера так делать нельзя: Nova возвращает служебную строку вместо UUID образа, из-за чего Terraform считал это дрейфом и пересоздавал уже созданные ВМ при каждом plan. `image_id` оставлен только внутри `block_device`.
5.**`/29` оказался слишком тесным** — с учётом служебных портов платформы. Заменено на `/28`.
Подробности каждого фикса — в `docs/changes/2026-09-06-provider-auth-wiring-*.md` и `docs/changes/2026-09-07-router-only-deployment-*.md`.
## Верификация
-`venv/bin/pytest terraform/tests -v` → 56 passed (офлайн, без обращения к облаку).
- Реальные `terraform init`/`plan`/`apply` против VK Cloud — успех, подтверждено пользователем вручную после развёртывания.