Confirmed working against a real VK Cloud PROD deployment (3 routers, 19 resources, apply succeeded end to end). Fixes found along the way: - provider "vkcs" was never configured (versions.tf) - username/password/ project_id/region were declared but wired to nothing; added auth_url and user_domain_name to complete it. - Nova keypairs are per-user, not per-project - added an optional vkcs_compute_keypair resource (var.ssh_public_key) so Terraform can register a keypair under the deploying service account itself. - router_priv_port used a hand-computed fixed_ip offset that collided with VKCS's own auto-created service ports on each network (observed: a "network:dns" port) - now left unset so Neutron's IPAM auto-assigns, which is collision-free by construction. - vkcs_compute_instance set image_id at the top level while also booting from a volume via block_device - the provider docs say not to do this; Nova echoes back a sentinel string for image_id on a volume-booted server, which Terraform read as drift on a ForceNew attribute and wanted to destroy+recreate every already-created instance on every subsequent plan. - private_network_cidrs bumped from /29 to /28 - too tight once the platform's own reserved ports are accounted for. Also removed the priv_srv_01/02/03 demo instances and the LAN network/ security group only they used - this deployment provisions router VMs only, confirmed with the user. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011hXR2ftXZZhJ4Y3XuSoR8r
5.0 KiB
Summary: подключение provider "vkcs" и безопасная передача PROD-credentials
Дата: 2026-09-06 План: 2026-09-06-provider-auth-wiring-plan.md
Что сделано
terraform/versions.tf
Добавлен блок:
provider "vkcs" {
auth_url = var.auth_url
username = var.username
password = var.password
project_id = var.project_id
region = var.region
user_domain_name = var.user_domain_name
}
До этого username/password/project_id/region были orphaned-переменными — объявлены, но нигде не использовались.
terraform/variables.tf
- Добавлены
auth_url(default"https://infra.mail.ru:35357/v3/") иuser_domain_name(default"users", для сервисных аккаунтов —"service-users"). - Исправлен дефолт
region: было"ME1"(код availability zone, спутан с регионом), стало"RegionOne"(реальный OpenStack-регион VK Cloud, подтвержденоopenrc.shпользователя —OS_REGION_NAME=RegionOne). Раньше это не проявлялось, т.к. переменная не была подключена ни к чему.
.gitignore
Добавлены *.auto.tfvars, *.auto.tfvars.json, terraform.tfvars.local — реальные credentials передаются через автоматически подхватываемый Terraform overlay-файл, а не через правки закоммиченного terraform.tfvars.
terraform/prod.auto.tfvars.example (новый файл, без секретов)
Документирует паттерн и маппинг полей openrc.sh (OS_AUTH_URL, OS_USERNAME, OS_PASSWORD, OS_PROJECT_ID, OS_REGION_NAME, OS_USER_DOMAIN_NAME) → переменные Terraform.
terraform/tests/test_terraform_delivery.py
Добавлены тесты: test_provider_vkcs_wires_all_auth_variables (regression guard — provider-блок реально подключает все 6 auth-переменных), test_auth_variable_has_a_default (auth_url/user_domain_name/region — есть дефолт), test_gitignore_excludes_auto_tfvars_overlay, test_prod_auto_tfvars_example_is_not_gitignored, test_tfvars_template_has_no_auth_credentials (в закоммиченном terraform.tfvars не должно быть auth_url/user_domain_name). Итог: 48 passed (было 38).
README.md / docs/QUICKSTART.md
Добавлен раздел "Provider authentication" / обновлён шаг 2 Quick Start — описан paттерн *.auto.tfvars и маппинг полей openrc.sh.
Реальная проверка с PROD credentials
Пользователь передал openrc.sh сервисного аккаунта. Во временной директории вне репозитория (не в git, удалена сразу после проверки) собран overlay-файл с реальными значениями (auth_url, username, password, project_id, region=RegionOne, user_domain_name=service-users), поверх закоммиченного terraform.tfvars. Выполнены:
terraform init— успех, провайдер и бэкенд инициализированы.terraform plan(read-only, ничего не создано) — успех:Plan: 24 to add, 0 to change, 0 to destroy. Подтверждена реальная аутентификация кhttps://infra.mail.ru:35357/v3/и успешный резолвинг всех трёх data source'ов (vkcs_images_image.ubuntu24,vkcs_networking_network.extnetпоname="internet",vkcs_networking_secgroup.defaultпоname="default") — т.е. соответствующие объекты реально существуют в проекте с ожидаемыми именами.
Пароль и прочие секреты нигде не сохранялись в репозитории; временная директория удалена немедленно после проверки (подтверждено).
Верификация
terraform fmt -check -recursive→ чисто.- Реальные
terraform init/validate(локальный provider-mirror) → успех. - Реальный
terraform planс PROD credentials (вне репозитория) → успех, 24 ресурса к созданию, 0 ошибок. venv/bin/pytest terraform/tests -v→ 48 passed.
Следующий шаг
terraform apply для реального PROD-развёртывания (3 роутера) пользователем ещё не подтверждён — это отдельное, необратимое действие, требующее явного разрешения.