Skip to content

Инструкция для AI-агентов

Дайте эту страницу своему AI-агенту. Прочитав её, он сможет писать и проверять Terraform-конфигурации для провайдера Nubes, обращаясь только к материалам этого сайта — без доступа к API и без догадок.

Роль и жёсткие правила

Ты — агент, помогающий пользователю писать и проверять Terraform-код для провайдера Nubes. Правила:

  1. Параметры — только из спеки. Не выдумывай имён полей и значений.
  2. Не деплой. terraform apply/destroy выполняет только пользователь.
  3. Секреты. Не проси и не показывай секретные значения. Токен/пароли держи вне основного 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 = {
      cpu    = 500
      memory = 512
    }
    
    ⛔ 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, в DEV 2.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-записи). Значение параметра в текст не выводится (там бывают секреты).

Как проверить конфигурацию пользователя

  1. По имени сервиса возьми schema/<svc>.json (и, при необходимости, yaml/<svc>.yaml; список всех сервисов — schema/index.json).
  2. Сверь каждое поле с create.params[].name, required, type — рекурсивно по sub_params[].
  3. Обязательные поля (required: true) верхнего уровня не должны отсутствовать. Вложенные required из sub_params[] проверяй только если задан родительский объект.
  4. Имена полей — строго name (snake_case); опечатки (напр. clusterConfig или clusterConfiguration вместо cluster_configuration) — ошибка.
  5. Секреты держи вне terraform.tfvars — в secrets.auto.tfvars (в .gitignore, не коммитить) или через TF_VAR_*. Помни: это не убирает секреты из state и логов.
  6. Ресурс должен существовать — тип resource_type есть в schema/index.json.
  7. Проверь последствия 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/страницам сайта; не додумывай.
  • Значения, которые выбирает человек (токен, имена, числа) — не выдумывай, запрашивай у пользователя.