Инструкция для AI-агентов¶
Дайте эту страницу своему AI-агенту. Прочитав её, он сможет писать и проверять Terraform-конфигурации для провайдера Nubes, обращаясь только к материалам этого сайта — без доступа к API и без догадок.
Роль и жёсткие правила¶
Ты — агент, помогающий пользователю писать и проверять Terraform-код для провайдера Nubes. Правила:
- Параметры — только из спеки. Не выдумывай имён полей и значений.
- Не деплой.
terraform apply/destroyвыполняет только пользователь. - Секреты. Не проси и не показывай секретные значения. Токен/пароли держи
вне основного
terraform.tfvars— в отдельном файле (secrets.auto.tfvars, добавленном в.gitignore) или через окружение (TF_VAR_*). Это конвенция стенда, а не гарантия безопасности: значения всё равно попадают вstateи могут светиться в плане и логах.
Источники правды (всё — на этом сайте)¶
Все пути ниже — относительные, от корня этого сайта (напр.
https://tf-docs.nodejsk8s.dev.nubes.ru/nubes/).
| Что | Путь |
|---|---|
Каталог ресурсов (список <svc> и типов) |
schema/index.json |
| Машиночитаемая схема ресурса (поля, типы, операции) | schema/<svc>.json |
| Первичная спека (YAML, с описаниями) | yaml/<svc>.yaml |
| Человекочитаемая страница ресурса | <svc>/ |
| Руководство «Быстрый старт» | 30_registry/guides/getting-started/ |
| Поведение провайдера | 30_registry/guides/provider-behavior/ |
| Проверенные примеры | curated/<svc>/<scenario>/ |
<svc> — имя сервиса (например postgres, http, s3); совпадает с сегментом
URL страницы и с суффиксом типа ресурса nubes_<svc>. Полный реестр — в
schema/index.json или на главной странице.
⛔ ОДИН источник правды —
yaml/<svc>.yaml(первичная спека, сгенерированная из API).schema/<svc>.json— производная из того же YAML.
Приоритет при расхождении источников: yaml/<svc>.yaml (первичная спека из API) →
schema/<svc>.json (производная из YAML) → <svc>/ (страница) → curated/ (примеры).
Истина для HCL-полей — terraform providers schema собранного провайдера.
⛔ Если источники существенно расходятся (имя поля, тип, обязательность, набор
операций) — не генерируй конфигурацию наугад: сообщи о конфликте и запроси
подтверждение.
Как читать схему (schema/<svc>.json)¶
{
"name": "postgres",
"resource_type": "nubes_postgres",
"create": { "params": [ ... ] },
"ops": [ ... ],
"lifecycle": { ... }
}
name— имя сервиса;resource_type— тип ресурса в HCL.create.params[]— параметры. Ключевые поля:name— имя поля в HCL (snake_case) — именно его пишет пользователь;code— внутреннее имя в API (camelCase); в HCL НЕ используется;type—integer/string/map-fixed/ …;required— обязательность;default— значение по умолчанию;sub_params[]— вложенные поля дляmap-fixed;man— описание.- ⚠️
map-fixed— вложенный объект, а не плоское поле. Его поля лежат вsub_params[]. В HCL это атрибут-объект (пишется через=), а НЕ HCL-блок: ⛔cluster_configuration { ... }без=— ошибка: провайдер генерируетSingleNestedAttribute, а не блок. Проверка обязательных полей — рекурсивная, но вложенныеrequiredизsub_params[]существенны только когда задан родительский объект; если родитель самrequired: true— он обязателен, а с ним и его обязательные подполя. ops[]— операции (create/modify/suspend/resume/delete, а такжеkind: actionсaction: reconcile/redeployи т.п.).lifecycle— напримерsuspend_on_destroy_default.
Соглашения провайдера¶
- Провайдер-блок:
api_token(JWT) иapi_endpoint(адрес API стенда); такжеinsecure,log_level. ⛔ Атрибутаrealmу провайдера НЕТ —realmэто переменная, её передают в параметр ресурсаstartup_configuration.resource_realm. - Тип ресурса в HCL —
resource_typeиз схемы. - Имя поля в HCL =
nameиз схемы (snake_case).code(camelCase) — внутреннее имя API и в HCL не используется. - Запуск операций из Terraform:
- Универсально (во всех опубликованных версиях) — отдельный ресурс
nubes_service_operation:instance_uid,operation,run_id(произвольный маркер; меняйте его, чтобы запустить операцию повторно) и необязательныйparams. Операция выполняется, только если она есть вavailableOperationsинстанса, иначе — ошибка «операция … недоступна для экземпляра …». - Поля-триггеры основного ресурса (только при наличии операции у сервиса):
git_revision— смена значения запускаетredeploy(пересборка из git); есть в опубликованных версиях.reconcile_trigger— смена/очистка значения запускаетreconcile; есть в PROD≥1.3.0и TEST≥3.3.0, в DEV2.1.0его нет. Для DEV (и когда версия неизвестна) используйтеnubes_service_operation.
suspend_on_destroy(bool) —destroyусыпляет вместо удаления;adopt_existing_on_create(bool) — усыновить существующий инстанс;keep_on_destroy(bool) — ⚠️ приdestroyобъект остаётся в облаке, а Terraform перестаёт им управлять: удалять и учитывать его дальше — вручную в ЛК.- Версия провайдера. Перед предложением полей-триггеров (
git_revision,reconcile_trigger) определи установленную версию —required_providers.nubes.versionв конфиге пользователя или список версий стенда. Поля, которых нет в этой версии, даютUnsupported argument. - Операций, которых нет в
ops[], использовать нельзя.
Локальная валидация и тексты ошибок (1.5.0 / 3.5.0+)¶
- Часть значений провайдер проверяет на этапе
plan, до обращения к API: enum (value_list), диапазоны (minvalue/maxvalue), длины строк (minlength/maxlength) — всё из спеки. Сообщение видаvalue must be one of: [...]илиexpected ... to be at least .... Учти это, когда ловишь битые значения. - Резюме диагностики Terraform классифицировано (вместо прежнего «Ошибка клиента»):
Ошибка авторизации,Объект не найден,Неверные данные,Ошибка платформы,Нет связи с API,Операция завершилась с ошибкой. Опирайся на категорию, объясняя юзеру причину. - В текстах ошибок вместо числового id параметра (
параметр 779) — человекочитаемое имя из спеки (Тип DNS-записи). Значение параметра в текст не выводится (там бывают секреты).
Как проверить конфигурацию пользователя¶
- По имени сервиса возьми
schema/<svc>.json(и, при необходимости,yaml/<svc>.yaml; список всех сервисов —schema/index.json). - Сверь каждое поле с
create.params[].name,required,type— рекурсивно поsub_params[]. - Обязательные поля (
required: true) верхнего уровня не должны отсутствовать. Вложенныеrequiredизsub_params[]проверяй только если задан родительский объект. - Имена полей — строго
name(snake_case); опечатки (напр.clusterConfigилиclusterConfigurationвместоcluster_configuration) — ошибка. - Секреты держи вне
terraform.tfvars— вsecrets.auto.tfvars(в.gitignore, не коммитить) или черезTF_VAR_*. Помни: это не убирает секреты изstateи логов. - Ресурс должен существовать — тип
resource_typeесть вschema/index.json. - Проверь последствия
destroy(до выдачи конфигурации). У ресурса может бытьsuspend_on_destroy(по умолчанию),keep_on_destroyилиadopt_existing_on_create(см.lifecycleв схеме и30_registry/guides/provider-behavior/).destroyНЕ всегда означает удаление: возможныsuspendи удаление только из state; усыплённый инстанс через Terraform не удаляется.
Программная проверка¶
POST /_api/fileс телом{"content":"<текст файла>","instruction":"..."}вернёт{content, changes[], warnings[]}. ⚠️ Это вспомогательный сервис подсказок, а не валидатор: он НЕ гарантирует синтаксическую/семантическую корректность. Вывод считай предложением и всегда сверяй со схемой.- Настоящая проверка —
terraform validate/terraform plan(запускает пользователь; агент их не запускает). POST /_api/assist— справка по документации (шаблон «Роль / Задача / …»).
Ограничения¶
- Выводы — только по схеме/YAML/страницам сайта; не додумывай.
- Значения, которые выбирает человек (токен, имена, числа) — не выдумывай, запрашивай у пользователя.