refactor: restructure project — separate tools, config, generated, provider
TOOLS/ — generators + scripts + config + ARCHITECTURE.md ├── yaml-generator/ (code) ├── resource-generator/ (code) ├── docs-generator/ (code) ├── scripts/ (← devops/*.sh) ├── config/ (← devops/profiles/ + devops/config/) │ ├── test/ profile.env, services_list.txt, operation_timeouts.json │ ├── prod/ │ └── dev/ └── ARCHITECTURE.md (← devops/ARCHITECTURE.md) generated/ — pipeline output only (gitignored) ├── test/resources_yaml/, go/, docs/, provider_build/ ├── prod/ └── dev/ provider/ — code only, no generated files resources_yaml/ — DELETED (generated) internal/resources_gen/ — DELETED (generated) devops/ — removed (replaced by TOOLS/scripts + TOOLS/config + generated/) Generators now fail if NUBES_*_DIR not set (no defaults to provider/). Provider requires pipeline to populate resources_gen/ before build.
This commit is contained in:
+5
-3
@@ -5,9 +5,11 @@
|
||||
*.tfvars
|
||||
.terraform.lock.hcl
|
||||
|
||||
# === Generated docs (by stand — NEVER commit, regenerate from API) ===
|
||||
docs_gen/
|
||||
universal_rebuild/docs_gen/
|
||||
# === Generated files (NOT code — regenerate from API) ===
|
||||
provider/resources_yaml/
|
||||
provider/internal/resources_gen/
|
||||
generated/
|
||||
TOOLS/bin/
|
||||
universal_rebuild/docs-gen/
|
||||
|
||||
# === Build artifacts (generated by devops scripts) ===
|
||||
|
||||
@@ -3,12 +3,12 @@ NUBES_API_ENDPOINT="https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||||
TOKEN_FILE="secrets/test.token"
|
||||
|
||||
# Release versions
|
||||
RELEASE_VERSION="5.0.59"
|
||||
PROVIDER_VERSION="5.0.59"
|
||||
DOCS_VERSION="5.0.59"
|
||||
RELEASE_VERSION="5.0.60"
|
||||
PROVIDER_VERSION="5.0.60"
|
||||
DOCS_VERSION="5.0.60"
|
||||
|
||||
# Docs generation — ONLY from docs_gen/<stand>/ (never from docs/)
|
||||
DOCS_GEN_DIR="universal_rebuild/docs_gen/test"
|
||||
DOCS_GEN_DIR="provider/docs_gen/test"
|
||||
|
||||
# Registry/S3 settings
|
||||
REGISTRY_HOST="terra.k8c.ru"
|
||||
@@ -22,7 +22,7 @@ import (
|
||||
func main() {
|
||||
resourcesDirFlag := flag.String("resources", "", "Path to resources_yaml")
|
||||
docsDirFlag := flag.String("docs", "", "Path to docs/30_registry/resources")
|
||||
servicesListFlag := flag.String("services", "", "Path to devops/config/services_list.txt")
|
||||
servicesListFlag := flag.String("services", "", "Path to TOOLS/config/{stand}/services_list.txt")
|
||||
excludeFlag := flag.String("exclude", "", "Comma-separated resource names to skip")
|
||||
versionFlag := flag.String("version", "", "Provider version for example block")
|
||||
apiEndpointFlag := flag.String("api-endpoint", "https://deck-api.ngcloud.ru/api/v1/index.cfm", "API endpoint for example block")
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
// generate_resources_v2 — главный генератор Terraform-провайдера Nubes.
|
||||
//
|
||||
// ⛔ ПОДЧИНЯЕТСЯ devops/ARCHITECTURE.md — все правила генерации прописаны там.
|
||||
// ⛔ ПОДЧИНЯЕТСЯ TOOLS/ARCHITECTURE.md — все правила генерации прописаны там.
|
||||
//
|
||||
// Пайплайн: YAML-спеки сервисов → Go-ресурсы + registry.go.
|
||||
//
|
||||
@@ -17,7 +17,6 @@ package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"resource-generator/internal/loader"
|
||||
@@ -25,17 +24,13 @@ import (
|
||||
)
|
||||
|
||||
func main() {
|
||||
root, err := os.Getwd()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
resourcesDir := strings.TrimSpace(os.Getenv("NUBES_RESOURCES_DIR"))
|
||||
if resourcesDir == "" {
|
||||
resourcesDir = filepath.Join(root, "resources_yaml")
|
||||
panic("NUBES_RESOURCES_DIR is required — must point to generated/{stand}/resources_yaml/")
|
||||
}
|
||||
outDir := strings.TrimSpace(os.Getenv("NUBES_RESOURCES_GEN_DIR"))
|
||||
if outDir == "" {
|
||||
outDir = filepath.Join(root, "internal", "resources_gen")
|
||||
panic("NUBES_RESOURCES_GEN_DIR is required — must point to generated/{stand}/go/")
|
||||
}
|
||||
|
||||
instanceResources, subresources, actions, err := loader.LoadSpecs(resourcesDir)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
DEFAULT_BASE_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
|
||||
DEFAULT_BASE_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
||||
BASE_DIR="${BASE_DIR:-${DEFAULT_BASE_DIR}}"
|
||||
CLIENT_ID="${CLIENT_ID:-account-console}"
|
||||
TOKEN_URL="${TOKEN_URL:-https://keycloak.nubes.ru/realms/cloud/protocol/openid-connect/token}"
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_DIR="${ROOT_DIR}/provider"
|
||||
PROFILE_DIR="${PROFILE_DIR:-}"
|
||||
|
||||
@@ -43,7 +43,7 @@ resolve_root_path() {
|
||||
echo "${ROOT_DIR}/${path_value}"
|
||||
}
|
||||
|
||||
SERVICES_FILE_DEFAULT="${ROOT_DIR}/devops/config/services_list.txt"
|
||||
SERVICES_FILE_DEFAULT="${PROFILE_DIR}/services_list.txt"
|
||||
if [[ -f "${PROFILE_DIR}/services_list.txt" ]]; then
|
||||
SERVICES_FILE_DEFAULT="${PROFILE_DIR}/services_list.txt"
|
||||
fi
|
||||
@@ -68,7 +68,7 @@ fi
|
||||
# - Формат имени файла: ID_имя.yaml (например, 13_s3bucket.yaml).
|
||||
#
|
||||
# Источники данных:
|
||||
# - Список сервисов: ${ROOT_DIR}/devops/config/services_list.txt
|
||||
# - Список сервисов: TOOLS/config/{stand}/services_list.txt
|
||||
# - API endpoint: ${API_ENDPOINT}
|
||||
# - Токен: переменная NUBES_API_TOKEN или файл .token.
|
||||
#
|
||||
@@ -109,7 +109,7 @@ API_ENDPOINT="${NUBES_API_ENDPOINT:-https://deck-api.ngcloud.ru/api/v1/index.cfm
|
||||
# Auto-detect API style: if endpoint contains "index.cfm" → legacy proxy (?endpoint=),
|
||||
# otherwise → new REST gateway (direct paths). No forced /index.cfm normalization.
|
||||
|
||||
GENERATED_DIR="${PROFILE_DIR}/generated"
|
||||
GENERATED_DIR="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")"
|
||||
YAML_OUTPUT_DIR_DEFAULT="${GENERATED_DIR}/resources_yaml"
|
||||
FAILURES_FILE_DEFAULT="${GENERATED_DIR}/tmp/yaml_gen_failures.txt"
|
||||
|
||||
+2
-2
@@ -5,11 +5,11 @@ set -euo pipefail
|
||||
# Canonical docs generator for unified resources_yaml.
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_DIR="${ROOT_DIR}/provider"
|
||||
RESOURCES_YAML_DIR="${PROVIDER_DIR}/resources_yaml"
|
||||
DOCS_DIR="${ROOT_DIR}/docs/30_registry/resources"
|
||||
SERVICES_LIST_PATH="${ROOT_DIR}/devops/config/services_list.txt"
|
||||
SERVICES_LIST_PATH="${PROFILE_DIR}/services_list.txt"
|
||||
|
||||
cd "$PROVIDER_DIR"
|
||||
|
||||
+4
-4
@@ -5,7 +5,7 @@ set -euo pipefail
|
||||
# Restores instruction-style docs structure (manual/example/params_create/params_modify/outputs/ops/params landing).
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_DIR="${ROOT_DIR}/provider"
|
||||
PROFILE_DIR="${PROFILE_DIR:-}"
|
||||
|
||||
@@ -48,10 +48,10 @@ fi
|
||||
|
||||
PROFILE_DIR="$(resolve_root_path "$PROFILE_DIR")"
|
||||
|
||||
RESOURCES_YAML_DIR_DEFAULT="${PROFILE_DIR}/generated/resources_yaml"
|
||||
DOCS_DIR_DEFAULT="${PROFILE_DIR}/generated/docs"
|
||||
RESOURCES_YAML_DIR_DEFAULT="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/resources_yaml"
|
||||
DOCS_DIR_DEFAULT="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/docs"
|
||||
SERVICES_LIST_PATH_DEFAULT="${PROFILE_DIR}/services_list.txt"
|
||||
GO_OUTPUT_DIR_DEFAULT="${PROFILE_DIR}/generated/go"
|
||||
GO_OUTPUT_DIR_DEFAULT="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/go"
|
||||
|
||||
RESOURCES_YAML_DIR="${RESOURCES_YAML_DIR:-$RESOURCES_YAML_DIR_DEFAULT}"
|
||||
DOCS_DIR="${DOCS_DIR:-$DOCS_DIR_DEFAULT}"
|
||||
+6
-6
@@ -2,9 +2,9 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_MAIN="${ROOT_DIR}/provider/main.go"
|
||||
BUILD_SCRIPT="${ROOT_DIR}/devops/build-provider.sh"
|
||||
BUILD_SCRIPT="${ROOT_DIR}/TOOLS/scripts/build-provider.sh"
|
||||
PROFILE_DIR="${PROFILE_DIR:-}"
|
||||
|
||||
if [[ "${1:-}" == "--profile" ]]; then
|
||||
@@ -45,10 +45,10 @@ resolve_root_path() {
|
||||
}
|
||||
|
||||
S3CFG_REGISTRY="${S3CFG_REGISTRY:-${ROOT_DIR}/secrets/.s3cfg_registry}"
|
||||
TIMEOUTS_SOURCE="${TIMEOUTS_SOURCE:-${ROOT_DIR}/devops/config/operation_timeouts.json}"
|
||||
PROFILE_RESOURCES_YAML_DIR="${PROFILE_DIR}/generated/resources_yaml"
|
||||
PROFILE_GENERATED_GO_DIR="${PROFILE_DIR}/generated/go"
|
||||
PROFILE_BUILD_DIR="${PROFILE_DIR}/generated/provider_build"
|
||||
TIMEOUTS_SOURCE="${TIMEOUTS_SOURCE:-${PROFILE_DIR}/operation_timeouts.json}"
|
||||
PROFILE_RESOURCES_YAML_DIR="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/resources_yaml"
|
||||
PROFILE_GENERATED_GO_DIR="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/go"
|
||||
PROFILE_BUILD_DIR="${ROOT_DIR}/generated/$(basename "$PROFILE_DIR")/provider_build"
|
||||
S3CFG_REGISTRY="$(resolve_root_path "$S3CFG_REGISTRY")"
|
||||
TIMEOUTS_SOURCE="$(resolve_root_path "$TIMEOUTS_SOURCE")"
|
||||
PROFILE_RESOURCES_YAML_DIR="$(resolve_root_path "$PROFILE_RESOURCES_YAML_DIR")"
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_MAIN="${ROOT_DIR}/provider/main.go"
|
||||
PROFILE_DIR="${PROFILE_DIR:-}"
|
||||
|
||||
@@ -74,7 +74,7 @@ TMP_DOCS_DIR=""
|
||||
|
||||
if [[ -n "$PROFILE_DIR" ]]; then
|
||||
# ⛔ NEVER merge with docs/ — ONLY generated docs from docs_gen/<stand>/
|
||||
DOCS_GEN_DIR="${DOCS_GEN_DIR:-provider/docs_gen/test}"
|
||||
DOCS_GEN_DIR="${DOCS_GEN_DIR:-generated/test}"
|
||||
DOCS_GEN_DIR="$(resolve_root_path "$DOCS_GEN_DIR")"
|
||||
if [[ -d "$DOCS_GEN_DIR" ]]; then
|
||||
export MKDOCS_DOCS_DIR="$DOCS_GEN_DIR"
|
||||
@@ -2,8 +2,8 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
SCRIPT="${ROOT_DIR}/devops/01_generate_yamls.sh"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
SCRIPT="${ROOT_DIR}/TOOLS/scripts/01_generate_yamls.sh"
|
||||
TOKEN_FILE="${TOKEN_FILE:-}"
|
||||
REQUEST_DELAY="${REQUEST_DELAY:-0.2}"
|
||||
ATTEMPTS="${ATTEMPTS:-3}"
|
||||
+2
-2
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
TOKEN_FILE="${TOKEN_FILE:-}"
|
||||
|
||||
if [[ -z "$TOKEN_FILE" ]]; then
|
||||
@@ -15,4 +15,4 @@ if [[ -z "$TOKEN_FILE" || ! -f "$TOKEN_FILE" ]]; then
|
||||
fi
|
||||
|
||||
export TOKEN_FILE
|
||||
exec "${ROOT_DIR}/devops/10_yaml_stability_run.sh"
|
||||
exec "${ROOT_DIR}/TOOLS/scripts/10_yaml_stability_run.sh"
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
TOKEN_FILE="${TOKEN_FILE:-}"
|
||||
|
||||
if [[ -z "$TOKEN_FILE" ]]; then
|
||||
@@ -15,4 +15,4 @@ if [[ -z "$TOKEN_FILE" || ! -f "$TOKEN_FILE" ]]; then
|
||||
fi
|
||||
|
||||
export TOKEN_FILE
|
||||
exec "${ROOT_DIR}/devops/01_generate_yamls.sh"
|
||||
exec "${ROOT_DIR}/TOOLS/scripts/01_generate_yamls.sh"
|
||||
@@ -2,7 +2,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_DIR="${ROOT_DIR}/provider"
|
||||
|
||||
if [[ ! -d "${PROVIDER_DIR}/resources_yaml" ]]; then
|
||||
@@ -13,4 +13,4 @@ fi
|
||||
# Start from a clean slate to avoid stale YAMLs.
|
||||
rm -f "${PROVIDER_DIR}/resources_yaml"/*.yaml
|
||||
|
||||
exec "${ROOT_DIR}/devops/12_generate_yamls_latest.sh"
|
||||
exec "${ROOT_DIR}/TOOLS/scripts/12_generate_yamls_latest.sh"
|
||||
@@ -28,7 +28,7 @@
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/.." && pwd)}"
|
||||
ROOT_DIR="${ROOT_DIR:-$(cd "${SCRIPT_DIR}/../.." && pwd)}"
|
||||
PROVIDER_DIR="${PROVIDER_DIR:-${ROOT_DIR}/provider}"
|
||||
BUILD_DIR="${BUILD_DIR:-${ROOT_DIR}/artifacts/provider_build}"
|
||||
GPG_KEY_FILE="${GPG_KEY_FILE:-${ROOT_DIR}/secrets/private_key.asc}"
|
||||
@@ -34,11 +34,7 @@ func main() {
|
||||
|
||||
outputDir := cfg.OutputDir
|
||||
if outputDir == "" {
|
||||
repoRoot, err := config.FindRepoRoot()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
outputDir = filepath.Join(repoRoot, "resources_yaml")
|
||||
panic("NUBES_OUTPUT_DIR is required — generated files must go to generated/{stand}/resources_yaml/")
|
||||
}
|
||||
if err := spec.ValidateOutputDir(outputDir); err != nil {
|
||||
panic(err)
|
||||
|
||||
@@ -1,151 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Дополнительный генератор: обогащает *_outputs.md реальными ключами
|
||||
из output_inventory (собранного со стендов).
|
||||
|
||||
Обновляет только секцию "## Реальные поля из облака" — не трогает остальное.
|
||||
|
||||
Запуск (из корня репо на VM):
|
||||
python3 devops/04b_enrich_outputs_from_inventory.py [--dry-run]
|
||||
"""
|
||||
|
||||
import json, yaml, glob, os, sys
|
||||
|
||||
BASE = "/home/naeel/terra/terraform"
|
||||
YAML_DIR = f"{BASE}/devops/profiles/test/generated/resources_yaml"
|
||||
INV_DIR = f"{BASE}/devops/profiles/test/generated/output_inventory"
|
||||
DOCS_DIR = f"{BASE}/docs/30_registry/resources"
|
||||
|
||||
SECTION_MARKER = "## Реальные поля из облака"
|
||||
|
||||
|
||||
def flatten(obj, prefix=""):
|
||||
"""Рекурсивно собирает dot-notation ключи из вложенного dict/list."""
|
||||
keys = []
|
||||
if isinstance(obj, dict):
|
||||
for k, v in obj.items():
|
||||
full = f"{prefix}.{k}" if prefix else k
|
||||
keys.append(full)
|
||||
if isinstance(v, (dict, list)):
|
||||
keys.extend(flatten(v, full))
|
||||
elif isinstance(obj, list):
|
||||
for i, v in enumerate(obj):
|
||||
full = f"{prefix}.{i}" if prefix else str(i)
|
||||
if isinstance(v, (dict, list)):
|
||||
keys.extend(flatten(v, full))
|
||||
# скалярные элементы списка не добавляем — нет смысла
|
||||
return keys
|
||||
|
||||
|
||||
def best_instance(instances):
|
||||
"""Выбираем лучший инстанс: running с данными > suspended с данными."""
|
||||
candidates = [i for i in instances if i.get("out") or i.get("params")]
|
||||
if not candidates:
|
||||
return None
|
||||
running = [i for i in candidates if i.get("status") == "running"]
|
||||
return running[-1] if running else candidates[-1]
|
||||
|
||||
|
||||
def build_section(inst):
|
||||
params = inst.get("params") or {}
|
||||
out = inst.get("out") or {}
|
||||
vault = inst.get("vault_keys") or []
|
||||
source = inst.get("source", "test")
|
||||
name = inst.get("name", "?")
|
||||
status = inst.get("status", "?")
|
||||
|
||||
lines = [
|
||||
f"{SECTION_MARKER} ({source} / {name} / {status})\n",
|
||||
"\n",
|
||||
"Поля ниже получены из реальных инстансов этого сервиса в облаке.\n",
|
||||
"Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.\n",
|
||||
]
|
||||
|
||||
if params:
|
||||
lines.append("\n### `state_params` ключи\n\n")
|
||||
for k in params.keys():
|
||||
lines.append(f'- `state_params["{k}"]`\n')
|
||||
|
||||
flat_out = flatten(out)
|
||||
if flat_out:
|
||||
lines.append("\n### `state_out_flat` ключи\n\n")
|
||||
for k in flat_out:
|
||||
lines.append(f'- `state_out_flat["{k}"]`\n')
|
||||
|
||||
if vault:
|
||||
lines.append("\n### `vault_secrets` ключи\n\n")
|
||||
for k in vault:
|
||||
lines.append(f'- `vault_secrets["{k}"]`\n')
|
||||
|
||||
return "".join(lines)
|
||||
|
||||
|
||||
def main():
|
||||
dry_run = "--dry-run" in sys.argv
|
||||
|
||||
# 1. service_id → name (из YAML)
|
||||
svc_to_name = {}
|
||||
for f in glob.glob(f"{YAML_DIR}/*.yaml"):
|
||||
try:
|
||||
d = yaml.safe_load(open(f))
|
||||
sid = d.get("service_id")
|
||||
name = d.get("name") or d.get("service_short_name")
|
||||
if sid and name:
|
||||
svc_to_name[sid] = name
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
updated = 0
|
||||
skipped = 0
|
||||
|
||||
for inv_file in sorted(glob.glob(f"{INV_DIR}/svc_*.json")):
|
||||
if "index" in inv_file:
|
||||
continue
|
||||
|
||||
inv = json.load(open(inv_file))
|
||||
svc_id = inv.get("serviceId")
|
||||
inst = best_instance(inv.get("instances", []))
|
||||
|
||||
if not inst:
|
||||
print(f" skip svc={svc_id}: нет данных")
|
||||
skipped += 1
|
||||
continue
|
||||
|
||||
name = svc_to_name.get(svc_id)
|
||||
if not name:
|
||||
print(f" skip svc={svc_id}: нет YAML маппинга")
|
||||
skipped += 1
|
||||
continue
|
||||
|
||||
out_path = f"{DOCS_DIR}/{name}_outputs.md"
|
||||
if not os.path.exists(out_path):
|
||||
print(f" skip svc={svc_id} ({name}): нет файла {name}_outputs.md")
|
||||
skipped += 1
|
||||
continue
|
||||
|
||||
new_section = build_section(inst)
|
||||
content = open(out_path).read()
|
||||
|
||||
if SECTION_MARKER in content:
|
||||
idx = content.index(SECTION_MARKER)
|
||||
new_content = content[:idx] + new_section
|
||||
else:
|
||||
new_content = content.rstrip("\n") + "\n\n" + new_section
|
||||
|
||||
if dry_run:
|
||||
print(f" dry-run svc={svc_id} ({name}): {out_path}")
|
||||
print(f" params={list((inst.get('params') or {}).keys())}")
|
||||
print(f" out_flat_count={len(flatten(inst.get('out') or {}))}")
|
||||
print(f" vault={inst.get('vault_keys', [])}")
|
||||
else:
|
||||
with open(out_path, "w") as f:
|
||||
f.write(new_content)
|
||||
print(f" updated svc={svc_id} ({name})")
|
||||
|
||||
updated += 1
|
||||
|
||||
print(f"\nДone: {updated} updated, {skipped} skipped")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,246 +0,0 @@
|
||||
# DevOps — Pipeline сборки Terraform-провайдера Nubes
|
||||
|
||||
## Обзор
|
||||
|
||||
```
|
||||
API Nubes → YAML → Go-ресурсы → Провайдер → S3 Registry
|
||||
↘ Markdown-доки → MkDocs-сайт
|
||||
```
|
||||
|
||||
## Инструменты (TOOLS/)
|
||||
|
||||
| Бинарник | Исходники | Назначение |
|
||||
|---|---|---|
|
||||
| `TOOLS/bin/yaml-generator` | `TOOLS/yaml-generator/` | API → `resources_yaml/*.yaml` |
|
||||
| `TOOLS/bin/resource-generator` | `TOOLS/resource-generator/` | YAML → `internal/resources_gen/*.go` |
|
||||
| `TOOLS/bin/docs-generator` | `TOOLS/docs-generator/` | YAML → Markdown-документация |
|
||||
|
||||
Каждый инструмент — независимый Go-модуль со своим `go.mod`.
|
||||
|
||||
## Скрипты пайплайна
|
||||
|
||||
| # | Скрипт | Что делает |
|
||||
|---|---|---|
|
||||
| 00 | `00_token_manager.sh` | Получение/обновление API-токенов |
|
||||
| 01 | `01_generate_yamls.sh` | API → YAML (требует `--profile`) |
|
||||
| 02 | `02_generate_resources_and_docs_v2.sh` | YAML → Go + Docs (требует `--profile`) |
|
||||
| 03 | `03_build_and_upload_provider.sh` | Сборка провайдера → GPG → S3 |
|
||||
| 04 | `04_build_and_publish_docs.sh` | MkDocs-сайт → публикация |
|
||||
| — | `10_yaml_stability_run.sh` | Тест стабильности (N запусков 01) |
|
||||
| — | `11_yaml_stability_run_latest.sh` | Авто-токен → 10 |
|
||||
| — | `12_generate_yamls_latest.sh` | Авто-токен → 01 |
|
||||
| — | `13_generate_yamls_clean.sh` | Очистка YAML + авто-токен → 01 |
|
||||
| — | `build-provider.sh` | Быстрая локальная сборка (без S3) |
|
||||
|
||||
## Профили стендов
|
||||
|
||||
```
|
||||
devops/profiles/
|
||||
├── test/profile.env # lk-api-gateway-test.ngcloud.ru
|
||||
├── prod/profile.env # продакшн
|
||||
└── dev/profile.env # дев-стенд
|
||||
```
|
||||
|
||||
Каждый профиль: свой endpoint, токен, версия, S3-бакет, GPG-ключи.
|
||||
|
||||
## Полный пайплайн (пример для test-стенда)
|
||||
|
||||
```bash
|
||||
# 1. Токен
|
||||
./devops/00_token_manager.sh --profile devops/profiles/test
|
||||
|
||||
# 2. YAML из API
|
||||
./devops/01_generate_yamls.sh --profile devops/profiles/test
|
||||
|
||||
# 3. Go-ресурсы + документация
|
||||
./devops/02_generate_resources_and_docs_v2.sh --profile devops/profiles/test
|
||||
|
||||
# 4. Сборка и загрузка провайдера
|
||||
./devops/03_build_and_upload_provider.sh --profile devops/profiles/test
|
||||
|
||||
# 5. Публикация документации
|
||||
./devops/04_build_and_publish_docs.sh --profile devops/profiles/test
|
||||
```
|
||||
|
||||
## Структура проекта
|
||||
|
||||
```
|
||||
tf_provider/
|
||||
├── TOOLS/ # Генераторы (независимые Go-модули)
|
||||
│ ├── yaml-generator/
|
||||
│ ├── resource-generator/
|
||||
│ ├── docs-generator/
|
||||
│ └── bin/ # Скомпилированные бинарники
|
||||
├── provider/ # Terraform-провайдер (Go-модуль)
|
||||
│ ├── internal/
|
||||
│ │ ├── core/ # HTTP-клиент API
|
||||
│ │ ├── provider/ # Регистрация провайдера
|
||||
│ │ ├── resources_core/ # Общая логика CRUD
|
||||
│ │ └── resources_gen/ # Сгенерированные ресурсы
|
||||
│ └── main.go
|
||||
└── devops/ # Скрипты пайплайна + профили
|
||||
├── profiles/
|
||||
└── config/
|
||||
```
|
||||
|
||||
## Архитектура
|
||||
|
||||
Подробно: `devops/ARCHITECTURE.md`.
|
||||
|
||||
Outputs:
|
||||
- YAML files in `universal_rebuild/resources_yaml` (file names use `ID_name.yaml`)
|
||||
|
||||
Note:
|
||||
- Every run regenerates all YAML specs from the API for the services listed in `services_list.txt`.
|
||||
- This overwrites previous YAMLs and ensures resources/docs match the current API for that list.
|
||||
- Before generation, the scripts clean old YAML and generated Go files, so each run starts from a clean slate.
|
||||
|
||||
## Step 2: Generate Go resources and docs
|
||||
|
||||
Script: `02_generate_resources_and_docs_v2.sh`
|
||||
|
||||
Example:
|
||||
```bash
|
||||
./devops/02_generate_resources_and_docs_v2.sh
|
||||
```
|
||||
|
||||
Outputs:
|
||||
- Go files in `universal_rebuild/internal/resources_gen`
|
||||
- Docs in `docs/30_registry/resources`
|
||||
|
||||
## Step 3: Build and upload provider
|
||||
|
||||
Script: `03_build_and_upload_provider.sh`
|
||||
|
||||
Uses `registry-server-build/build-provider.sh` and signs with:
|
||||
- `secrets/private_key.asc` (ignored by git)
|
||||
|
||||
Example:
|
||||
```bash
|
||||
export S3_ENDPOINT=https://s3.msk-1.ngcloud.ru
|
||||
export S3_ACCESS_KEY=...
|
||||
export S3_SECRET_KEY=...
|
||||
./devops/03_build_and_upload_provider.sh 2.0.2
|
||||
```
|
||||
|
||||
## Step 4: Build and publish docs
|
||||
|
||||
Script: `04_build_and_publish_docs.sh`
|
||||
|
||||
Example:
|
||||
```bash
|
||||
export S3_ENDPOINT=https://s3.msk-1.ngcloud.ru
|
||||
export S3_ACCESS_KEY=...
|
||||
export S3_SECRET_KEY=...
|
||||
./devops/04_build_and_publish_docs.sh 2.0.2
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The GPG private key must remain stable across releases. Do not regenerate per build.
|
||||
- If the key is regenerated, the registry server must be updated to serve the new public key.
|
||||
- Terraform will fail with `authentication signature from unknown issuer` if the registry public key does not match the signing key.
|
||||
- `config/services_list.txt` is the source of truth for which services are generated.
|
||||
- If the provider version changes, update `universal_rebuild/main.go`.
|
||||
|
||||
## Quickstart (fresh run)
|
||||
|
||||
```bash
|
||||
# 0) Prepare token
|
||||
export TOKEN_FILE=<repo_root>/HH-MM-SS.token
|
||||
|
||||
# 1) Generate YAML specs from API
|
||||
./devops/01_generate_yamls.sh
|
||||
|
||||
# 2) Generate Go resources + docs
|
||||
./devops/02_generate_resources_and_docs_v2.sh
|
||||
|
||||
# 3) Build + upload provider
|
||||
./devops/03_build_and_upload_provider.sh 2.0.2
|
||||
|
||||
# 4) Build + publish docs
|
||||
./devops/04_build_and_publish_docs.sh 2.0.2
|
||||
```
|
||||
|
||||
## Troubleshooting checklist
|
||||
|
||||
- If YAML generation fails: check token, API endpoint, and `/tmp/yaml_gen_failures.txt`.
|
||||
- If docs are missing: run `02_generate_resources_and_docs_v2.sh`.
|
||||
- If registry rejects artifacts: verify GPG key and public key in registry server.
|
||||
|
||||
## One-time GPG bootstrap (do this once, keep the key stable)
|
||||
|
||||
1) Generate and export keys (no passphrase):
|
||||
```bash
|
||||
GPG_DIR=<repo_root>/secrets
|
||||
GNUPGHOME=$(mktemp -d)
|
||||
cat > /tmp/gpg_batch <<'EOF'
|
||||
%no-protection
|
||||
Key-Type: RSA
|
||||
Key-Length: 4096
|
||||
Subkey-Type: RSA
|
||||
Subkey-Length: 4096
|
||||
Name-Real: tazet@narod.ru
|
||||
Name-Email: tazet@narod.ru
|
||||
Expire-Date: 0
|
||||
EOF
|
||||
gpg --batch --homedir "$GNUPGHOME" --gen-key /tmp/gpg_batch
|
||||
gpg --batch --homedir "$GNUPGHOME" --armor --export-secret-keys > "$GPG_DIR/private_key.asc"
|
||||
gpg --batch --homedir "$GNUPGHOME" --armor --export > "$GPG_DIR/public_key.asc"
|
||||
rm -rf "$GNUPGHOME" /tmp/gpg_batch
|
||||
```
|
||||
|
||||
2) Update registry server public key (ASCII Armor) in:
|
||||
- `registry-server-build/main.go`
|
||||
- `operator/cmd/registry/main.go`
|
||||
|
||||
3) Rebuild and redeploy the registry server (see `docs/50_history/00_system_mechanics.md`).
|
||||
|
||||
4) Build and upload provider artifacts as usual.
|
||||
|
||||
## Token and self-run shortcuts
|
||||
|
||||
Token capture (JSON from F12):
|
||||
```bash
|
||||
cat token.json | ./devops/00_token_manager.sh save -
|
||||
```
|
||||
|
||||
Use latest token automatically:
|
||||
```bash
|
||||
./devops/12_generate_yamls_latest.sh
|
||||
```
|
||||
|
||||
10-run stability test (latest token):
|
||||
```bash
|
||||
REQUEST_DELAY=0.3 ATTEMPTS=3 ./devops/11_yaml_stability_run_latest.sh
|
||||
```
|
||||
|
||||
Log output:
|
||||
```bash
|
||||
tail -n 200 /tmp/yaml_gen_runs.log
|
||||
```
|
||||
|
||||
## Legacy (deprecated)
|
||||
|
||||
- Ops YAML and ops-doc generators were removed after the unified YAML migration.
|
||||
|
||||
## Docs build policy (updated)
|
||||
|
||||
- `mkdocs`/`mkdocs-material` are **not** installed on every docs generation run.
|
||||
- Preferred path: build docs in Docker (`squidfunk/mkdocs-material`) via `04_build_and_publish_docs.sh`.
|
||||
- Fallback path: local `mkdocs` is used only if it is already installed.
|
||||
- If local `mkdocs` is missing, install once in persistent virtualenv and reuse.
|
||||
|
||||
One-time setup example:
|
||||
|
||||
```bash
|
||||
python3 -m venv .venv
|
||||
.venv/bin/pip install mkdocs mkdocs-material
|
||||
```
|
||||
|
||||
Then run docs publish normally:
|
||||
|
||||
```bash
|
||||
./devops/04_build_and_publish_docs.sh <version>
|
||||
```
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
# GitLab CI - pipeline для сборки и публикации Terraform Provider Registry
|
||||
stages:
|
||||
- test
|
||||
- build
|
||||
- sign
|
||||
- publish
|
||||
|
||||
variables:
|
||||
HARBOR_HOST: "pearlharbor.registryk8s.services.ngcloud.ru"
|
||||
S3_BUCKET: "terraform-registry"
|
||||
PROVIDER_NAME: "nubes"
|
||||
PROVIDER_NAMESPACE: "nubes"
|
||||
|
||||
test:
|
||||
stage: test
|
||||
image: golang:1.24
|
||||
script:
|
||||
- cd universal_rebuild
|
||||
- go test ./...
|
||||
- go vet ./...
|
||||
|
||||
build-provider:
|
||||
stage: build
|
||||
image: golang:1.24
|
||||
script:
|
||||
- cd universal_rebuild
|
||||
- GOOS=linux GOARCH=amd64 go build -o bin/terraform-provider-${PROVIDER_NAME}_linux_amd64
|
||||
- GOOS=darwin GOARCH=amd64 go build -o bin/terraform-provider-${PROVIDER_NAME}_darwin_amd64
|
||||
- GOOS=windows GOARCH=amd64 go build -o bin/terraform-provider-${PROVIDER_NAME}_windows_amd64.exe
|
||||
artifacts:
|
||||
paths: [universal_rebuild/bin/]
|
||||
|
||||
build-images:
|
||||
stage: build
|
||||
script:
|
||||
- docker build -t ${HARBOR_HOST}/terraform/registry-server:${CI_COMMIT_TAG} registry-server-build/
|
||||
- docker build -t ${HARBOR_HOST}/terraform/registry-operator:${CI_COMMIT_TAG} operator/
|
||||
- docker push ${HARBOR_HOST}/terraform/registry-server:${CI_COMMIT_TAG}
|
||||
- docker push ${HARBOR_HOST}/terraform/registry-operator:${CI_COMMIT_TAG}
|
||||
only:
|
||||
- tags
|
||||
|
||||
sign:
|
||||
stage: sign
|
||||
image: golang:1.24
|
||||
script:
|
||||
- cd universal_rebuild/bin
|
||||
- sha256sum terraform-provider-* > SHA256SUMS
|
||||
- gpg --import $GPG_PRIVATE_KEY
|
||||
- gpg --detach-sign SHA256SUMS
|
||||
artifacts:
|
||||
paths:
|
||||
- universal_rebuild/bin/SHA256SUMS
|
||||
- universal_rebuild/bin/SHA256SUMS.gpg
|
||||
|
||||
publish-to-s3:
|
||||
stage: publish
|
||||
image: alpine:3.19
|
||||
before_script:
|
||||
- apk add --no-cache s3cmd
|
||||
script:
|
||||
- s3cmd put universal_rebuild/bin/* s3://${S3_BUCKET}/terraform-providers/
|
||||
only:
|
||||
- tags
|
||||
@@ -1,17 +0,0 @@
|
||||
{
|
||||
"default_timeout": "10m",
|
||||
"idle_timeout": "10m",
|
||||
"operations": {
|
||||
"create": "10m",
|
||||
"modify": "7m",
|
||||
"resume": "7m",
|
||||
"suspend": "7m",
|
||||
"create_user": "7m",
|
||||
"delete_user": "6m",
|
||||
"create_database": "7m",
|
||||
"delete_database": "6m"
|
||||
},
|
||||
"overrides": {
|
||||
"services.90.create": "7m"
|
||||
}
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
# service_id service_name # RU description
|
||||
# do not delete lines; to exclude a service, comment it with #
|
||||
1 dummy # Болванка для тестов
|
||||
2 template # Болванка для тестирования
|
||||
12 s3 # Масштабируемое хранилище данных
|
||||
13 s3bucket # Бакет в сервисе S3
|
||||
19 vcOrg # Организация в Cloud Director
|
||||
20 vcOrgSaas # Без интеграции Keycloak
|
||||
21 vc_vdc # Выделение вычислительных ресурсов
|
||||
22 vc_nsxt # Обеспечение сетевой доступности в тенанте
|
||||
23 vc_vm # Виртуальная машина без каких-либо особенностей. <br/>Данная услуга запускает vc_ip для выдачи белого адреса и подключения к ВМ
|
||||
# 24 DEPRECATED Правила маршрутизации для VM (vc_nat) # excluded from active generation
|
||||
25 vcexternalip # Резервирование IP адреса
|
||||
26 vapp # Группировка виртуальных машин
|
||||
27 vc_vm_v2 # Виртуальная машина с возможностью настройки Cloud Init<br/>Можно развернуть в услуге несколько ВМ<br/>В зависимости от настроек можно выдавать на ВМ vip + dns
|
||||
28 vc_vm_v3 # Создание виртуальной машины
|
||||
29 vcVdcGroup # Обеспечение сетевой доступности между датацентрами
|
||||
32 vmpostgre # Сервис настройки PostgreSQL для виртуальной машины.<br/>Требует наличия ВМ
|
||||
50 nextcloud # Платформа совместной работы
|
||||
81 superset # Сервер отчетов
|
||||
82 harbor # Реестр для хранения образов контейнеров
|
||||
88 k8sZitiController # Контроллер управления Client to service & service to service Zero trust network<br/>
|
||||
89 flask # Flask
|
||||
90 postgres # Управляемая база данных PostgreSQL
|
||||
91 redis # Управляемая база данных Redis
|
||||
92 mongodb # Управляемая база данных MongoDB
|
||||
93 rabbitmq # Сервер очередей
|
||||
94 lucee # Cервер приложений
|
||||
95 nodejs # Cервер приложений
|
||||
96 pgadmin # Административный интерфейс для PostgreSQL
|
||||
97 nodered # Low-code платформа для IoT
|
||||
98 http # Простой HTTP контейнер
|
||||
99 gitea # Сервис контроля версий
|
||||
100 openwhisk # Добавление и удаления пользователя (учетной записи, тенанта) для работы с Openwhisk
|
||||
110 dnszone # Хостинг DNS зоны
|
||||
111 dnsrecord # DNS запись в созданной зоне
|
||||
112 tenant # Организация доступов к мониторингу
|
||||
113 vcComplex # Создание готовой иерархии ресурсов
|
||||
114 GiteaComplex # Комплексная услуга из ["gittea", "postgres"]
|
||||
115 mariadb # Управляемая база данных MySQL
|
||||
116 kafka # Сервис создания кластера Apache Kafka
|
||||
117 nifi # ETL-система
|
||||
119 Akhq # Web интерфейс Akhq для работы с Apache Kafka
|
||||
120 clickhouse # Управляемая база данных ClickHouse
|
||||
149 valoTenant # Корпоративная система обмена и синхронизации файлов
|
||||
150 k8sSthutrvalCluster # Платформа управления K8s<br/>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
# Инструкция по развертыванию Apache Kafka через платформу<br/><br/>---<br/>## 1. Общая информация<br/>AKHQ — это веб-интерфейс для работы с кластерами Apache Kafka.<br/>Позволяет просматривать топики, consumer group'ы, сообщения, ACL, схему безопасности, состояние брокеров и метаданные.<br/>Поддерживает работу с несколькими кластерами Kafka одновременно, включая внутренние и внешние (TLS) подключения.<br/><br/>## Доступные операции<br/>- **create** — Создание ресурса AKHQ<br/>- **suspend** — Остановка ресурса<br/>- **resume** — Возобновление работы ресурса<br/>- **modify** — Модификация настроек<br/>- **delete** — Удаление ресурса<br/><br/>---<br/>## 2. Параметры развертывания кластера<br/>Ниже перечислены параметры, которые необходимо указать при создании ресурса Kafka:<br/><br/>* **Кластер Kafka к которому нужно настроить подключение**<br/>Для использования AKHQ необходимо предварительно развернуть сервис Kafka. Пример: `kafka-external`.<br/><br/>* **Платформа для развертывания:**<br/>Платформа для развертывания (среда, в которой будет развернут кластер). Пример: `k8s-3.ext.nubes.ru`.<br/><br/>* **Количество узлов в сети:**<br/>Количество узлов для работы Akhq. Пример `2`<br/><br/>* **Квота (megabyte) памяти пода:**<br/>Квота памяти пода в мегабайтах. Пример: `512`<br/><br/>* **Квота (millicore ) ядра пода:**<br/>Квота CPU пода в миликорах (1000 mCPU = 1 vCPU). Пример: `500`<br/><br/>* **Имя домена:**<br/>Dns Имя по которому будет происходить обращение к сервису. Указать необходимо уникальное имя до . ( то есть если необходимо получить dns ui) Пример: `kafka-external`<br/><br/>---<br/>## 4. Выходные параметры<br/>После успешного развертывания ресурса Kafka платформа возвращает ряд параметров.<br/>Ключевым из них является:<br/><br/>**connectionUrl**<br/>Это полное доменное имя (FQDN), по которому будет доступен интерфейс AKHQ. После развёртывания подождите несколько минут — UI станет доступен по HTTPS, как только все сервисы полностью запустятся.<br/><br/>**Учетные данные**<br/>Здесь представлены поля для ввода логина и пароля, с помощью которых вы сможете авторизоваться в сервисе.<br/><br/>---<br/>## 5. Дополнительная информация<br/>Учётные записи, созданные для работы с AKHQ, предоставляют доступ только для просмотра данных. Для управления Kafka, пожалуйста, используйте возможности личного кабинета.<br/>---
|
||||
</div>
|
||||
@@ -0,0 +1,50 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Copy-ready manifest (`akhq_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_akhq" "baza" {
|
||||
resource_realm = "TODO" # Выбрать платформу из списка
|
||||
domain = "TODO" # Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm
|
||||
kafka_uid = "TODO" # Выбрать кластер из списка
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
resource_memory = 512 # Пример: `1024`
|
||||
resource_cpu = 500 # Пример: `1000`
|
||||
resource_instances = 1
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_akhq.baza.state_params["имя_ключа"]
|
||||
nubes_akhq.baza.state_out["имя_ключа"]
|
||||
nubes_akhq.baza.state_params_flat["имя_ключа"]
|
||||
nubes_akhq.baza.state_out_flat["имя_ключа"]
|
||||
nubes_akhq.baza.vault_secrets["имя_ключа"]
|
||||
nubes_akhq.baza.vault_url
|
||||
nubes_akhq.baza.vault_user_path
|
||||
nubes_akhq.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](akhq_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](akhq_params_modify.md)
|
||||
- `resume`
|
||||
- `suspend`
|
||||
@@ -0,0 +1,33 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["connectionUrl"]`
|
||||
|
||||
### `vault_secrets` ключи
|
||||
|
||||
- `vault_secrets["pass"]`
|
||||
- `vault_secrets["user"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](akhq_params_create.md)
|
||||
- [Modify params](akhq_params_modify.md)
|
||||
@@ -0,0 +1,40 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>550</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Выбрать платформу из списка</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
<tr><td>553</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td>Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$</td></tr>
|
||||
<tr><td>555</td><td><strong><code class="code-no-wrap">kafka_uid</code></strong></td><td><code>uuid</code></td><td>Выбрать кластер из списка</td><td>ref_svc_id=116</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>551</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>512</code></td><td>Пример: `1024`</td><td>minvalue=512</td></tr>
|
||||
<tr><td>552</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>500</code></td><td>Пример: `1000`</td><td>minvalue=500</td></tr>
|
||||
<tr><td>554</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td></td><td>minvalue=1</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resource nubes_akhq
|
||||
|
||||
Service ID: `119`
|
||||
|
||||
Service Name: Akhq
|
||||
|
||||
[Manual](akhq.md) | [Create params](akhq_params_create.md) | [Modify params](akhq_params_modify.md) | [Output params](akhq_outputs.md) | [Operations](akhq_ops.md) | [Example](akhq_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>565</td><td><strong><code class="code-no-wrap">kafka_uid</code></strong></td><td><code>uuid</code></td><td>Выбрать кластер из списка</td><td>ref_svc_id=116</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
Необходима DNS зона, в которой будет создана DNS запись.<br/>Выберите <br/>* Зону в которой будет создана запись<br/>* Тип записи<br/>* Имя записи<br/>* Значение записи
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Copy-ready manifest (`dnsrecord_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_dnsrecord" "baza" {
|
||||
zone_uid = "TODO" # UUID экземпляра услуги DNS-зоны
|
||||
record_type = "A" # Тип DNS-записи
|
||||
record_name = "TODO" # Имя записи. Имя зоны в конце проставляется автоматически
|
||||
record_input = "TODO" # Значение. Необходима валидация, в зависимости от типа записи. Должно быть заменено на UUID-внешнийIP
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
record_ttl = 3600 # Time-to-Leave записи. Раз в какое время запись будет обновлена
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_dnsrecord.baza.state_params["имя_ключа"]
|
||||
nubes_dnsrecord.baza.state_out["имя_ключа"]
|
||||
nubes_dnsrecord.baza.state_params_flat["имя_ключа"]
|
||||
nubes_dnsrecord.baza.state_out_flat["имя_ключа"]
|
||||
nubes_dnsrecord.baza.vault_secrets["имя_ключа"]
|
||||
nubes_dnsrecord.baza.vault_url
|
||||
nubes_dnsrecord.baza.vault_user_path
|
||||
nubes_dnsrecord.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](dnsrecord_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](dnsrecord_params_modify.md)
|
||||
@@ -0,0 +1,29 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["dnsServers"]`
|
||||
- `state_out_flat["record"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](dnsrecord_params_create.md)
|
||||
- [Modify params](dnsrecord_params_modify.md)
|
||||
@@ -0,0 +1,27 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>75</td><td><strong><code class="code-no-wrap">zone_uid</code></strong></td><td><code>uuid</code></td><td>UUID экземпляра услуги DNS-зоны</td><td>ref_svc_id=110</td></tr>
|
||||
<tr><td>76</td><td><strong><code class="code-no-wrap">record_type</code></strong></td><td><code>string</code></td><td>Тип DNS-записи</td><td>value_list=A, AAAA, CNAME, MX, PTR, SOA, SRV, TXT, LUA, NS, SSHFP</td></tr>
|
||||
<tr><td>77</td><td><strong><code class="code-no-wrap">record_name</code></strong></td><td><code>string</code></td><td>Имя записи. Имя зоны в конце проставляется автоматически</td><td>unique_scope=parent</td></tr>
|
||||
<tr><td>78</td><td><strong><code class="code-no-wrap">record_input</code></strong></td><td><code>string</code></td><td>Значение. Необходима валидация, в зависимости от типа записи. Должно быть заменено на UUID-внешнийIP</td><td></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>450</td><td><strong><code class="code-no-wrap">record_ttl</code></strong></td><td><code>integer</code></td><td><code>3600</code></td><td>Time-to-Leave записи. Раз в какое время запись будет обновлена</td><td>minvalue=30; maxvalue=604800</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resource nubes_dnsrecord
|
||||
|
||||
Service ID: `111`
|
||||
|
||||
Service Name: DNS запись
|
||||
|
||||
[Manual](dnsrecord.md) | [Create params](dnsrecord_params_create.md) | [Modify params](dnsrecord_params_modify.md) | [Output params](dnsrecord_outputs.md) | [Operations](dnsrecord_ops.md) | [Example](dnsrecord_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>256</td><td><strong><code class="code-no-wrap">record_input</code></strong></td><td><code>string</code></td><td>Запись. Необходима валидация, в зависимости от типа записи. Должно быть заменено на UUID-внешнийIP</td><td></td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
##  Необходимо делегировать зону у регистратора на Авторитетные DNS (Сервера зон)<br/><br/>ns3.ngcloud.ru<br/>``` bash<br/>185.247.187.83<br/>2a10:aa80:0:5::3<br/>```<br/><br/>ns4.ngcloud.ru<br/>``` bash<br/>81.22.46.43<br/>2a10:aa80:0:6::3<br/>```
|
||||
</div>
|
||||
@@ -0,0 +1,52 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Copy-ready manifest (`dnszone_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_dnszone" "baza" {
|
||||
zone_email = "TODO" # Контактный e-mail
|
||||
zone_name = "TODO" # Имя зоны
|
||||
resource_realm = "TODO" # Платформа для развертывания
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
zone_kind = "NATIVE" # Тип зоны
|
||||
zone_time_to_refresh = 86400 # Время ожидания ответа вторичного DNS перед запросом SOA-записи с первичных серверов
|
||||
zone_time_to_retry = 7200 # Время в течение которого сервер повторно попробует синхронизировать информацию с первичных DNS-серверов
|
||||
zone_time_to_expire = 3600000 # Время в течение которого вторичный DNS будет пытаться завершить синхронизацию зоны с первичным
|
||||
zone_time_to_live = 86400 # Время, в течение которого информация будет кешироваться другими DNS-серверами
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_dnszone.baza.state_params["имя_ключа"]
|
||||
nubes_dnszone.baza.state_out["имя_ключа"]
|
||||
nubes_dnszone.baza.state_params_flat["имя_ключа"]
|
||||
nubes_dnszone.baza.state_out_flat["имя_ключа"]
|
||||
nubes_dnszone.baza.vault_secrets["имя_ключа"]
|
||||
nubes_dnszone.baza.vault_url
|
||||
nubes_dnszone.baza.vault_user_path
|
||||
nubes_dnszone.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](dnszone_params_create.md)
|
||||
- `delete`
|
||||
@@ -0,0 +1,32 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["dnsServers"]`
|
||||
- `state_out_flat["dnsServers.ns1.nubes.ru"]`
|
||||
- `state_out_flat["dnsServers.ns2.nubes.ru"]`
|
||||
- `state_out_flat["zoneSerial"]`
|
||||
- `state_out_flat["zoneSoaServer"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](dnszone_params_create.md)
|
||||
- [Modify params](dnszone_params_modify.md)
|
||||
@@ -0,0 +1,31 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>66</td><td><strong><code class="code-no-wrap">zone_email</code></strong></td><td><code>string</code></td><td>Контактный e-mail</td><td></td></tr>
|
||||
<tr><td>67</td><td><strong><code class="code-no-wrap">zone_name</code></strong></td><td><code>string</code></td><td>Имя зоны</td><td>regex=^([a-z0-9-]+\.)+[a-z0-9-]+$</td></tr>
|
||||
<tr><td>69</td><td><strong><code class="code-no-wrap">zone_masters_for_slave</code></strong></td><td><code>string</code></td><td>Использовать если выбран тип SLAVE. IP адреса в формате через пробел для настройки Master-серверов</td><td></td></tr>
|
||||
<tr><td>284</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Платформа для развертывания</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>68</td><td><strong><code class="code-no-wrap">zone_kind</code></strong></td><td><code>string</code></td><td><code>NATIVE</code></td><td>Тип зоны</td><td>value_list=NATIVE, SLAVE</td></tr>
|
||||
<tr><td>70</td><td><strong><code class="code-no-wrap">zone_time_to_refresh</code></strong></td><td><code>string</code></td><td><code>86400</code></td><td>Время ожидания ответа вторичного DNS перед запросом SOA-записи с первичных серверов</td><td></td></tr>
|
||||
<tr><td>71</td><td><strong><code class="code-no-wrap">zone_time_to_retry</code></strong></td><td><code>string</code></td><td><code>7200</code></td><td>Время в течение которого сервер повторно попробует синхронизировать информацию с первичных DNS-серверов</td><td></td></tr>
|
||||
<tr><td>72</td><td><strong><code class="code-no-wrap">zone_time_to_expire</code></strong></td><td><code>string</code></td><td><code>3600000</code></td><td>Время в течение которого вторичный DNS будет пытаться завершить синхронизацию зоны с первичным</td><td></td></tr>
|
||||
<tr><td>73</td><td><strong><code class="code-no-wrap">zone_time_to_live</code></strong></td><td><code>string</code></td><td><code>86400</code></td><td>Время, в течение которого информация будет кешироваться другими DNS-серверами</td><td></td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,11 @@
|
||||
# Resource nubes_dnszone
|
||||
|
||||
Service ID: `110`
|
||||
|
||||
Service Name: DNS зона
|
||||
|
||||
[Manual](dnszone.md) | [Create params](dnszone_params_create.md) | [Modify params](dnszone_params_modify.md) | [Output params](dnszone_outputs.md) | [Operations](dnszone_ops.md) | [Example](dnszone_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
None.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
## Болванка для тестов.<br/><br/>А это просто много букв, чтобы посмотреть, как ведет себя текст при переполнении контейнера. <br/><br/><br/>``` json<br/>{<br/> "iamServiceUrl": "https://auth-api-test.ngcloud.ru/api/v1/user",<br/> "idpResponse": {<br/> "prefix": {<br/> "charset": "",<br/> "status_text": "Request Time-out",<br/> "text": true,<br/> "errordetail": "",<br/> "filecontent": "Connection Timeout",<br/> "responseheader": {},<br/> "header": "",<br/> "statuscode": "408 Request Time-out",<br/> "status_code": 408,<br/> "mimetype": "Unable to determine MIME type of file."<br/> }<br/> }<br/>}<br/>```
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Copy-ready manifest (`dummy_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_dummy" "baza" {
|
||||
resource_realm = "TODO" # Платформа для развертывания
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
duration_ms = 0 # перед завершением подождать (sleep) столько миллисекунд
|
||||
fail_at_start = false # если true, завершить джоб, ничего не записывая в cmdb
|
||||
fail_in_progress = false # если true, корректно начать выполнение джоба, но в процессе завершить аварийно, ничего не записывая в cmdb
|
||||
where_fail = 1 # принимает 1,2,3. Работает с failInProgress. 1 - упасть в prepare. 2 - упасть внутри блока Data fill. 3 - упасть после vault write
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_dummy.baza.state_params["имя_ключа"]
|
||||
nubes_dummy.baza.state_out["имя_ключа"]
|
||||
nubes_dummy.baza.state_params_flat["имя_ключа"]
|
||||
nubes_dummy.baza.state_out_flat["имя_ключа"]
|
||||
nubes_dummy.baza.vault_secrets["имя_ключа"]
|
||||
nubes_dummy.baza.vault_url
|
||||
nubes_dummy.baza.vault_user_path
|
||||
nubes_dummy.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,17 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](dummy_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](dummy_params_modify.md)
|
||||
- `reconcile`
|
||||
- `redeploy`
|
||||
- `resume`
|
||||
- `suspend`
|
||||
@@ -0,0 +1,28 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `vault_secrets` ключи
|
||||
|
||||
- `vault_secrets["someKey"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](dummy_params_create.md)
|
||||
- [Modify params](dummy_params_modify.md)
|
||||
@@ -0,0 +1,46 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>242</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Наименование ресурсной платформы для подключения</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
<tr><td>286</td><td><strong><code class="code-no-wrap">bodymessage</code></strong></td><td><code>string</code></td><td>Дата, уходящая в Vault</td><td></td></tr>
|
||||
<tr><td>321</td><td><strong><code class="code-no-wrap">map_example</code></strong></td><td><code>map</code></td><td></td><td></td></tr>
|
||||
<tr><td>322</td><td><strong><code class="code-no-wrap">json_example</code></strong></td><td><code>json</code></td><td>Для тестирования интерфейса. Сюда можно писать корректный json</td><td></td></tr>
|
||||
<tr><td>396</td><td><strong><code class="code-no-wrap">nested_ref_example</code></strong></td><td></td><td></td><td></td></tr>
|
||||
<tr><td>447</td><td><strong><code class="code-no-wrap">yaml_example</code></strong></td><td><code>yaml</code></td><td></td><td></td></tr>
|
||||
<tr><td>647</td><td><strong><code class="code-no-wrap">map_fixed</code></strong></td><td><code>map-fixed</code></td><td>Новый тип поля</td><td></td></tr>
|
||||
<tr><td>654</td><td><strong><code class="code-no-wrap">array_map_fixed_example</code></strong></td><td><code>array-map-fixed</code></td><td>Array of map-fixed</td><td></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>198</td><td><strong><code class="code-no-wrap">duration_ms</code></strong></td><td><code>integer</code></td><td><code>0</code></td><td>перед завершением подождать (sleep) столько миллисекунд</td><td></td></tr>
|
||||
<tr><td>199</td><td><strong><code class="code-no-wrap">fail_at_start</code></strong></td><td><code>boolean</code></td><td><code>false</code></td><td>**Операция не будет завершена**<br/>Она будет в постоянном статусе PENDING, однако в Jenkins Job завершится с ошибкой</td><td>value_list=false, true</td></tr>
|
||||
<tr><td>200</td><td><strong><code class="code-no-wrap">fail_in_progress</code></strong></td><td><code>boolean</code></td><td><code>false</code></td><td>если true, корректно начать выполнение джоба, но в процессе завершить аварийно, ничего не записывая в cmdb</td><td>value_list=false, true</td></tr>
|
||||
<tr><td>201</td><td><strong><code class="code-no-wrap">where_fail</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>принимает 1,2,3. Работает с failInProgress. 1 - упасть в prepare. 2 - упасть внутри блока Data fill. 3 - упасть после vault write</td><td>value_list=1, 2, 3</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,21 @@
|
||||
# Resource nubes_dummy
|
||||
|
||||
Service ID: `1`
|
||||
|
||||
Service Name: Болванка
|
||||
|
||||
[Manual](dummy.md) | [Create params](dummy_params_create.md) | [Modify params](dummy_params_modify.md) | [Output params](dummy_outputs.md) | [Operations](dummy_ops.md) | [Example](dummy_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>287</td><td><strong><code class="code-no-wrap">duration_ms</code></strong></td><td><code>integer</code></td><td>перед завершением подождать (sleep) столько миллисекунд</td><td></td></tr>
|
||||
<tr><td>288</td><td><strong><code class="code-no-wrap">fail_at_start</code></strong></td><td><code>boolean</code></td><td>если true, завершить джоб, ничего не записывая в cmdb</td><td>value_list=false, true</td></tr>
|
||||
<tr><td>289</td><td><strong><code class="code-no-wrap">fail_in_progress</code></strong></td><td><code>boolean</code></td><td>если true, корректно начать выполнение джоба, но в процессе завершить аварийно, ничего не записывая в cmdb</td><td>value_list=false, true</td></tr>
|
||||
<tr><td>290</td><td><strong><code class="code-no-wrap">where_fail</code></strong></td><td><code>integer</code></td><td>принимает 1,2,3. Работает с failInProgress. 1 - упасть в prepare. 2 - упасть внутри блока Data fill. 3 - упасть после vault write</td><td>value_list=1, 2, 3</td></tr>
|
||||
<tr><td>291</td><td><strong><code class="code-no-wrap">bodymessage</code></strong></td><td></td><td>Дата, уходящая в Vault</td><td></td></tr>
|
||||
<tr><td>373</td><td><strong><code class="code-no-wrap">map_example</code></strong></td><td><code>map</code></td><td></td><td></td></tr>
|
||||
<tr><td>374</td><td><strong><code class="code-no-wrap">json_example</code></strong></td><td></td><td></td><td></td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
# Инструкция по развертыванию Web-сервер с фреймворком Flask через платформу<br/><br/>## 1. Общая информация<br/><br/>Сервис **Web-сервер с фреймворком Flask** предназначен для развертывания веб-приложений на базе Flask.<br/><br/>### Доступные операции<br/><br/>create — включить сервис, развернуть веб-приложение с указанными параметрами.<br/>delete — удалить сервис, только после suspend.<br/>modify — изменить настройки сервиса и переразвернуть.<br/>suspend — выключить веб-приложение, остановить обслуживание.<br/>resume — включить веб-приложение после suspend.<br/><br/>---<br/><br/>## 2. Параметры развертывания<br/><br/>Параметры входных данных операции **create**:<br/><br/>### Имя домена<br/>Описание: доменное имя для доступа к веб-приложению. Если указан FQDN, происходит проверка DNS на валидность А-записи. А-запись должна указывать на балансировщик ресурсной платформы. Если указано имя в рамках одного октета, оно будет добавлено в публичную DNS-зону.<br/>Пример значения: строка, допустимые FQDN или имя в одном октете. Пример: example.com или myapp.<br/><br/>### Платформа для развертывания<br/>Описание: кластер Kubernetes, в котором будет развернуто приложение.<br/>Пример значения: идентификатор кластера Kubernetes.<br/><br/>### Квота ядра пода<br/>Описание: количество CPU, выделяемое на под, в Milicores.<br/>Пример значения: целое число, например 500 для 0.5 ядра.<br/><br/>### Квота памяти пода<br/>Описание: количество памяти, выделяемое на под, в Megabytes.<br/>Пример значения: целое число, например 512 для 512 MB.<br/><br/>### Кол-во реплик пода<br/>Описание: количество инстансов пода для масштабирования.<br/>Пример значения: целое число, шт, например 2.<br/><br/>### URL Проекта (gitpath)<br/>Описание: полный HTTPS путь до проекта в Git-репозитории.<br/>Пример значения: URL в формате https://github.com/myuser/myproject.git. Доступ к репозиторию должен быть публичным.<br/><br/>### URL HealthCheck<br/>Описание: путь для проверки здоровья приложения внутри пода.<br/>Пример значения: строка, путь, например /api/v1/health.<br/><br/>### Переменные окружения пода<br/>Описание: структура данных, которая будет передана как переменные окружения в под.<br/>Пример значения: ключ-значение, например {"ENV": "production"}.<br/><br/>---<br/><br/>## 3. Рекомендованные характеристики<br/><br/>### Тестовое окружение<br/>- Квота ядра пода: 300m (0.3 ядра)<br/>- Квота памяти пода: 256 MB<br/>- Кол-во реплик пода: 1<br/><br/>### Промышленное окружение<br/>- Квота ядра пода: от 1000m (1 ядро) в зависимости от нагрузки<br/>- Квота памяти пода: от 1024 MB (1 GB) с учетом потребностей приложения<br/>- Кол-во реплик пода: от 2 для обеспечения отказоустойчивости<br/><br/>---<br/><br/>## 4. Выходные параметры<br/>Операция create не возвращает явных выходных параметров. Успешное выполнение операции приводит к развертыванию сервиса, доступного по указанному домену.<br/><br/>---<br/><br/>## 5. Дополнительная информация<br/>- В корне проекта должен находиться файл requirements.txt со списком зависимостей Python.<br/>- Исходный код веб-приложения должен располагаться в директории site.<br/>- Запуск веб-сервера осуществляется командой python app.py.<br/>- Используется версия Python: python:3.12-slim.<br/>- Git-репозиторий должен быть публично доступен для платформы.<br/>- Операция delete возможна только после suspend.<br/>- Операция modify приводит к переразвертыванию с новыми параметрами.
|
||||
</div>
|
||||
@@ -0,0 +1,50 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Copy-ready manifest (`flask_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_flask" "baza" {
|
||||
resource_realm = "TODO" # Кластер Kubernetes в котором будет развёрнуто приложение
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
domain = "web01" # Если будет указан `FQDN`, то происходят проверки DNS на валидность А-записи. А-запись **обязана смотреть на балансировщик** ресурсной платформы. Если указано имя `в рамках одного октета`, будет добавлено **в публичную днс-зону**
|
||||
resource_cpu = 300 # Пример: `1000`
|
||||
resource_memory = 256 # Пример: `2048`
|
||||
resource_instances = 1 # Пример: `3`
|
||||
git_path = "https://github.com/Foxyhhd/Baldurs-Gate-test.git" # Пример: `https://github.com/myuser/myproject.git`
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_flask.baza.state_params["имя_ключа"]
|
||||
nubes_flask.baza.state_out["имя_ключа"]
|
||||
nubes_flask.baza.state_params_flat["имя_ключа"]
|
||||
nubes_flask.baza.state_out_flat["имя_ключа"]
|
||||
nubes_flask.baza.vault_secrets["имя_ключа"]
|
||||
nubes_flask.baza.vault_url
|
||||
nubes_flask.baza.vault_user_path
|
||||
nubes_flask.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](flask_params_create.md)
|
||||
- `delete` — Удаление возможно только после остановки сервиса через операцию `suspend` После выполнения операции необходимо выждать определенное кол-во времени
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](flask_params_modify.md)
|
||||
- `resume`
|
||||
- `suspend`
|
||||
@@ -0,0 +1,18 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](flask_params_create.md)
|
||||
- [Modify params](flask_params_modify.md)
|
||||
@@ -0,0 +1,42 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>249</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Выбрать платформу из списка<br/><br/>**Если список не отображается**<br/>обратитесь к сервис менеджеру с вопросом предоставления ресурсной платформы</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
<tr><td>254</td><td><strong><code class="code-no-wrap">json_env</code></strong></td><td><code>map</code></td><td>Структура, которая будет передана как переменные окружения</td><td></td></tr>
|
||||
<tr><td>255</td><td><strong><code class="code-no-wrap">health_path</code></strong></td><td><code>string</code></td><td>Может быть пустым. Если ничего не передано, проверяется `tcpsocket`<br/>Путь до healtcheck для запуска пода в Kubernetes, который отдаст 200 код</td><td></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>248</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td><code>web01</code></td><td>Если будет указан `FQDN`, то происходят проверки DNS на валидность А-записи. А-запись **обязана смотреть на балансировщик** ресурсной платформы.<br/>Если указано имя `в рамках одного октета`, будет добавлено **в публичную днс-зону**</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$</td></tr>
|
||||
<tr><td>250</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>300</code></td><td>Указывается в Milicores<br/>`1000` Mili == `1` Ядро</td><td>minvalue=100; maxvalue=8000</td></tr>
|
||||
<tr><td>251</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>256</code></td><td>Указывается в Megabytes</td><td>minvalue=128; maxvalue=8192</td></tr>
|
||||
<tr><td>252</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>Балансировка производится между всеми репликами</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>253</td><td><strong><code class="code-no-wrap">git_path</code></strong></td><td><code>string</code></td><td><code>https://github.com/Foxyhhd/Baldurs-Gate-test.git</code></td><td>Проект должен быть публичным</td><td></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,19 @@
|
||||
# Resource nubes_flask
|
||||
|
||||
Service ID: `89`
|
||||
|
||||
Service Name: Web-сервер с фреймворком Flask
|
||||
|
||||
[Manual](flask.md) | [Create params](flask_params_create.md) | [Modify params](flask_params_modify.md) | [Output params](flask_outputs.md) | [Operations](flask_ops.md) | [Example](flask_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>451</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td>Указывается в Milicores<br/>`1000` Mili == `1` Ядро</td><td>minvalue=100; maxvalue=8000</td></tr>
|
||||
<tr><td>452</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td>Указывается в Megabytes</td><td>minvalue=128; maxvalue=8192</td></tr>
|
||||
<tr><td>453</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td>Балансировка производится между всеми репликами</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>454</td><td><strong><code class="code-no-wrap">git_path</code></strong></td><td></td><td>Проект должен быть публичным</td><td></td></tr>
|
||||
<tr><td>455</td><td><strong><code class="code-no-wrap">json_env</code></strong></td><td><code>map</code></td><td>Структура, которая будет передана как переменные окружения</td><td></td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
Развертывает сервис контроля версий Gitea<br/>Зависит от сервиса postgresql который должен быть развернут заранее.
|
||||
</div>
|
||||
@@ -0,0 +1,50 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Copy-ready manifest (`gitea_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_gitea" "baza" {
|
||||
psql_uid = "TODO" # UUID Услуги k8sPgsql. Пользователя techGitea, базу данных gitea создаёт автоматически
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
resource_cpu = 500 # Квота ядра пода (Указывается в mili). 1000Mili = 1 Ядро
|
||||
resource_memory = 512 # Квота памяти пода (Указывается в Megabytes)
|
||||
resource_disk = 1 # Квота диска (Указывается в GIGAbytes)
|
||||
resource_instances = 1 # Количество узлов
|
||||
domain = "web01" # Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_gitea.baza.state_params["имя_ключа"]
|
||||
nubes_gitea.baza.state_out["имя_ключа"]
|
||||
nubes_gitea.baza.state_params_flat["имя_ключа"]
|
||||
nubes_gitea.baza.state_out_flat["имя_ключа"]
|
||||
nubes_gitea.baza.vault_secrets["имя_ключа"]
|
||||
nubes_gitea.baza.vault_url
|
||||
nubes_gitea.baza.vault_user_path
|
||||
nubes_gitea.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,15 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](gitea_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](gitea_params_modify.md)
|
||||
- `resume`
|
||||
- `suspend`
|
||||
@@ -0,0 +1,39 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["connectionUrl"]`
|
||||
- `state_out_flat["monitoring"]`
|
||||
- `state_out_flat["monitoring.allDashboards"]`
|
||||
- `state_out_flat["monitoring.base"]`
|
||||
- `state_out_flat["monitoring.base.url"]`
|
||||
- `state_out_flat["monitoring.loki"]`
|
||||
- `state_out_flat["monitoring.loki.url"]`
|
||||
|
||||
### `vault_secrets` ключи
|
||||
|
||||
- `vault_secrets["adminPass"]`
|
||||
- `vault_secrets["adminUser"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](gitea_params_create.md)
|
||||
- [Modify params](gitea_params_modify.md)
|
||||
@@ -0,0 +1,40 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>238</td><td><strong><code class="code-no-wrap">psql_uid</code></strong></td><td><code>uuid</code></td><td>UUID Услуги k8sPgsql. Пользователя techGitea, базу данных gitea создаёт автоматически</td><td>ref_svc_id=90</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>232</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>500</code></td><td>Квота ядра пода (Указывается в mili). 1000Mili = 1 Ядро</td><td>minvalue=300; maxvalue=4000</td></tr>
|
||||
<tr><td>233</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>512</code></td><td>Квота памяти пода (Указывается в Megabytes)</td><td>minvalue=256; maxvalue=8192</td></tr>
|
||||
<tr><td>234</td><td><strong><code class="code-no-wrap">resource_disk</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>Квота диска (Указывается в GIGAbytes)</td><td>minvalue=1; maxvalue=999</td></tr>
|
||||
<tr><td>235</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>Количество узлов в сети</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>237</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td><code>web01</code></td><td>Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$; unique_scope=provider</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,18 @@
|
||||
# Resource nubes_gitea
|
||||
|
||||
Service ID: `99`
|
||||
|
||||
Service Name: Gitea
|
||||
|
||||
[Manual](gitea.md) | [Create params](gitea_params_create.md) | [Modify params](gitea_params_modify.md) | [Output params](gitea_outputs.md) | [Operations](gitea_ops.md) | [Example](gitea_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>259</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td>Квота ядра пода (Указывается в mili). 1000Mili = 1 Ядро</td><td>minvalue=500; maxvalue=4000</td></tr>
|
||||
<tr><td>260</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td>Квота памяти пода (Указывается в Megabytes)</td><td>minvalue=256; maxvalue=8192</td></tr>
|
||||
<tr><td>261</td><td><strong><code class="code-no-wrap">resource_disk</code></strong></td><td><code>integer</code></td><td>Квота диска (Указывается в GIGAbytes)</td><td>minvalue=1; maxvalue=999</td></tr>
|
||||
<tr><td>262</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td>Количество узлов в сети</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
Расширенный реестр для управления Docker-образами с enterprise-функциями безопасности, репликации и контроля доступа.<br/>Container Registry позволяет хранить, развертывать и управлять Docker-образами контейнеров в инфраструктуре NGcloud.<br/>Сервис можно использовать в процессе разработки контейнеров. Например, вы можете настроить систему автоматизации на работу с реестром в Container Registry в рамках процесса непрерывной интеграции. Контейнеры идеально подходят для запуска небольших, независимых и легко изменяемых сервисов.<br/>Чтобы начать работу, создайте реестр и загрузите в него Docker-образ<br/>Авторизация: keycloak
|
||||
</div>
|
||||
@@ -0,0 +1,51 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Copy-ready manifest (`harbor_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_harbor" "baza" {
|
||||
resource_realm = "TODO" # Платформа для развертывания
|
||||
s3_uid = "TODO" # UUID экземпляра услуги S3
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
domain = "web01" # Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm
|
||||
emails = "testuser1" # Учётная запись, которой будут выданы админские права. Обязана находиться в Keycloak. Можно передавать несколько через пробел
|
||||
resource_cpu = 100 # Квота ядра пода (Указывается в mili). 1000Mili = 1 Ядро
|
||||
resource_memory = 200 # Квота памяти пода (Указывается в Megabytes)
|
||||
resource_instances = 1 # Количество узлов
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_harbor.baza.state_params["имя_ключа"]
|
||||
nubes_harbor.baza.state_out["имя_ключа"]
|
||||
nubes_harbor.baza.state_params_flat["имя_ключа"]
|
||||
nubes_harbor.baza.state_out_flat["имя_ключа"]
|
||||
nubes_harbor.baza.vault_secrets["имя_ключа"]
|
||||
nubes_harbor.baza.vault_url
|
||||
nubes_harbor.baza.vault_user_path
|
||||
nubes_harbor.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](harbor_params_create.md)
|
||||
- `delete` — DEV-Ветка удаления Harbor
|
||||
@@ -0,0 +1,40 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["connectionUrl"]`
|
||||
- `state_out_flat["monitoring"]`
|
||||
- `state_out_flat["monitoring.allDashboards"]`
|
||||
- `state_out_flat["monitoring.base"]`
|
||||
- `state_out_flat["monitoring.base.url"]`
|
||||
- `state_out_flat["monitoring.k8sregistry"]`
|
||||
- `state_out_flat["monitoring.k8sregistry.url"]`
|
||||
- `state_out_flat["monitoring.loki"]`
|
||||
- `state_out_flat["monitoring.loki.url"]`
|
||||
|
||||
### `vault_secrets` ключи
|
||||
|
||||
- `vault_secrets["adminPass"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](harbor_params_create.md)
|
||||
- [Modify params](harbor_params_modify.md)
|
||||
@@ -0,0 +1,29 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>110</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Наименование кластера Kubernetes для подключения</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
<tr><td>231</td><td><strong><code class="code-no-wrap">s3_uid</code></strong></td><td><code>uuid</code></td><td>UUID экземпляра услуги S3</td><td>ref_svc_id=12</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>16</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td><code>web01</code></td><td>Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$</td></tr>
|
||||
<tr><td>17</td><td><strong><code class="code-no-wrap">emails</code></strong></td><td><code>string</code></td><td><code>testuser1</code></td><td>Учётная запись, которой будут выданы админские права. Обязана находиться в Keycloak. Можно передавать несколько через пробел</td><td></td></tr>
|
||||
<tr><td>228</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>100</code></td><td>Квота ядра пода (Указывается в mili). 1000Mili = 1 Ядро</td><td>minvalue=100; maxvalue=4000</td></tr>
|
||||
<tr><td>229</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>200</code></td><td>Квота памяти пода (Указывается в Megabytes)</td><td>minvalue=128; maxvalue=8192</td></tr>
|
||||
<tr><td>230</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>Количество узлов в сети</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,11 @@
|
||||
# Resource nubes_harbor
|
||||
|
||||
Service ID: `82`
|
||||
|
||||
Service Name: Container Registry
|
||||
|
||||
[Manual](harbor.md) | [Create params](harbor_params_create.md) | [Modify params](harbor_params_modify.md) | [Output params](harbor_outputs.md) | [Operations](harbor_ops.md) | [Example](harbor_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
None.
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
Manual not available.
|
||||
</div>
|
||||
@@ -0,0 +1,51 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Copy-ready manifest (`http_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_http" "baza" {
|
||||
resource_realm = "TODO" # Платформа для развертывания
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
domain = "web01" # Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm
|
||||
resource_cpu = 100 # Квота ядра пода (Указывается в mili)
|
||||
resource_memory = 200 # Квота памяти пода (Указывается в Megabytes)
|
||||
resource_instances = 1 # Количество узлов
|
||||
registry_path = "nexus-sa.tst.nubes.ru/docker-nubes/jolt" # Путь до image, который будет установлен как deployment
|
||||
json_env = {"param": "value"} # Массив переменных, будут переданы в env приложения
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_http.baza.state_params["имя_ключа"]
|
||||
nubes_http.baza.state_out["имя_ключа"]
|
||||
nubes_http.baza.state_params_flat["имя_ключа"]
|
||||
nubes_http.baza.state_out_flat["имя_ключа"]
|
||||
nubes_http.baza.vault_secrets["имя_ключа"]
|
||||
nubes_http.baza.vault_url
|
||||
nubes_http.baza.vault_user_path
|
||||
nubes_http.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,16 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](http_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](http_params_modify.md)
|
||||
- `redeploy`
|
||||
- `resume`
|
||||
- `suspend`
|
||||
@@ -0,0 +1,34 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["connectionUrl"]`
|
||||
- `state_out_flat["monitoring"]`
|
||||
- `state_out_flat["monitoring.allDashboards"]`
|
||||
- `state_out_flat["monitoring.base"]`
|
||||
- `state_out_flat["monitoring.base.url"]`
|
||||
- `state_out_flat["monitoring.loki"]`
|
||||
- `state_out_flat["monitoring.loki.url"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](http_params_create.md)
|
||||
- [Modify params](http_params_modify.md)
|
||||
@@ -0,0 +1,41 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>216</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Наименование кластера Kubernetes для подключения</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>212</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td><code>web01</code></td><td>Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$; unique_scope=provider</td></tr>
|
||||
<tr><td>213</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>100</code></td><td>Квота ядра пода (Указывается в mili)</td><td>minvalue=100; maxvalue=4000</td></tr>
|
||||
<tr><td>214</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>200</code></td><td>Квота памяти пода (Указывается в Megabytes)</td><td>minvalue=128; maxvalue=8192</td></tr>
|
||||
<tr><td>215</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>1</code></td><td>Количество реплик приложения. Трафик будет распределяться между подами в режиме Round-Robin</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>217</td><td><strong><code class="code-no-wrap">registry_path</code></strong></td><td><code>string</code></td><td><code>nexus-sa.tst.nubes.ru/docker-nubes/jolt</code></td><td>Путь до image, который будет установлен как deployment</td><td></td></tr>
|
||||
<tr><td>241</td><td><strong><code class="code-no-wrap">json_env</code></strong></td><td><code>json</code></td><td><code>{&quot;param&quot;: &quot;value&quot;}</code></td><td>Массив переменных, будут переданы в env приложения</td><td></td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,17 @@
|
||||
# Resource nubes_http
|
||||
|
||||
Service ID: `98`
|
||||
|
||||
Service Name: Простой HTTP контейнер
|
||||
|
||||
[Manual](http.md) | [Create params](http_params_create.md) | [Modify params](http_params_modify.md) | [Output params](http_outputs.md) | [Operations](http_ops.md) | [Example](http_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>218</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td></td><td>minvalue=100; maxvalue=4000</td></tr>
|
||||
<tr><td>219</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td></td><td>minvalue=128; maxvalue=8192</td></tr>
|
||||
<tr><td>220</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td>Количество узлов</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,40 @@
|
||||
# Ресурсы провайдера
|
||||
|
||||
| ID | Ресурс | Описание |
|
||||
|-----|--------|----------|
|
||||
| 1 | [nubes_dummy](dummy.md) | Болванка |
|
||||
| 2 | [nubes_template](template.md) | Темплейт k8s |
|
||||
| 12 | [nubes_s3](s3.md) | S3 Object Storage |
|
||||
| 13 | [nubes_s3bucket](s3bucket.md) | S3 бакет |
|
||||
| 19 | [nubes_vc_org](vc_org.md) | Организация в Cloud Director |
|
||||
| 21 | [nubes_vc_vdc](vc_vdc.md) | Виртуальный датацентр (vDC) |
|
||||
| 22 | [nubes_vc_nsxt](vc_nsxt.md) | Сетевой шлюз периметра (Edge) |
|
||||
| 25 | [nubes_vcexternalip](vcexternalip.md) | Публичные IP адреса |
|
||||
| 26 | [nubes_vapp](vapp.md) | Виртуальный каталог ВМ (vApp) |
|
||||
| 28 | [nubes_vc_vm_v3](vc_vm_v3.md) | Виртуальная машина |
|
||||
| 29 | [nubes_vc_vdc_group](vc_vdc_group.md) | Группа датацентров |
|
||||
| 50 | [nubes_nextcloud](nextcloud.md) | Nextcloud |
|
||||
| 81 | [nubes_superset](superset.md) | Apache Superset |
|
||||
| 82 | [nubes_harbor](harbor.md) | Container Registry |
|
||||
| 88 | [nubes_k8s_ziti_controller](k8s_ziti_controller.md) | k8sZitiController |
|
||||
| 89 | [nubes_flask](flask.md) | Web-сервер с фреймворком Flask |
|
||||
| 90 | [nubes_postgres](postgres.md) | PostgreSQL |
|
||||
| 91 | [nubes_redis](redis.md) | Redis |
|
||||
| 92 | [nubes_mongodb](mongodb.md) | MongoDB |
|
||||
| 93 | [nubes_rabbitmq](rabbitmq.md) | RabbitMQ |
|
||||
| 94 | [nubes_lucee](lucee.md) | Lucee |
|
||||
| 95 | [nubes_nodejs](nodejs.md) | NodeJS |
|
||||
| 96 | [nubes_pgadmin](pgadmin.md) | pgAdmin |
|
||||
| 97 | [nubes_nodered](nodered.md) | NodeRed |
|
||||
| 98 | [nubes_http](http.md) | Простой HTTP контейнер |
|
||||
| 99 | [nubes_gitea](gitea.md) | Gitea |
|
||||
| 109 | [nubes_zones_v2](zones_v2.md) | Управление днс-зонами и записями |
|
||||
| 110 | [nubes_dnszone](dnszone.md) | DNS зона |
|
||||
| 111 | [nubes_dnsrecord](dnsrecord.md) | DNS запись |
|
||||
| 115 | [nubes_mariadb](mariadb.md) | Mariadb |
|
||||
| 116 | [nubes_kafka](kafka.md) | ApacheKafka |
|
||||
| 119 | [nubes_akhq](akhq.md) | Akhq |
|
||||
| 149 | [nubes_valo_tenant](valo_tenant.md) | VALO Cloud |
|
||||
| 150 | [nubes_k8s_sthutrval_cluster](k8s_sthutrval_cluster.md) | Kubernetes кластер Штурвал |
|
||||
| 151 | [nubes_k8s_openbao](k8s_openbao.md) | Vault |
|
||||
| 153 | [nubes_nifi](nifi.md) | Nifi |
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
# Инструкция по развертыванию Хранилища секретов через платформу<br/><br/>## 1. Общая информация<br/>Хранилище секретов — сервис централизованного и защищённого хранения чувствительных данных (секретов, ключей, конфигураций). Предназначен для использования приложениями и сервисами в Kubernetes с управлением доступом на основе ролей.<br/>В качестве приложения используется открытый проект OpenBao с поддержкой кластерного режима RAFT.<br/><br/>### Доступные операции<br/>**create** — Создание хранилища секретов и инициализация кластера.<br/>**delete** — Удаление хранилища секретов с полной очисткой всех связанных сущностей.<br/>**modify** — Изменение параметров развернутого хранилища секретов.<br/>**suspend** — Приостановка работы кластера без удаления Persistent Volume.<br/>**resume** — Возобновление работы кластера с автоматическим unseal всех нод.<br/>**restart** — Поочередный перезапуск нод с последующим подключением в кластер.<br/>**create_kv** — Создание Key/Value хранилища версии V2.<br/>**delete_kv** — Удаление Key/Value хранилища со всеми содержащимися секретами.<br/>**create_secrets** — Создание секрета внутри Key/Value хранилища.<br/>**delete_secrets** — Удаление секрета из Key/Value хранилища.<br/>**update_secrets** — Обновление значения секрета.<br/>**recovery_secrets** — Откат секрета к указанной версии.<br/>**create_role** — Создание роли для управления Key/Value хранилищем или секретами.<br/>**update_role** — Обновление параметров роли.<br/>**delete_role** — Удаление роли доступа.<br/><br/>---<br/><br/>## 2. Параметры развертывания<br/><br/>Параметры входных данных операции **create**:<br/><br/>### Платформа для развертывания<br/>Описание: Кластер Kubernetes, в котором будет развернуто приложение.<br/>Формат значения: имя Kubernetes-кластера.<br/><br/>### Имя домена<br/>Описание: Доменное имя сервиса. При указании полного FQDN выполняется проверка DNS A-записи или добавляется А-запись в техническую зону.<br/>Формат значения: secrets.domain.com / mysecretdomain.<br/><br/>### Кол-во реплик<br/>Описание: Количество узлов в кластере.<br/>Формат значения: целое число.<br/><br/>### Квота ядра пода<br/>Описание: Лимит CPU для одного узла. Указывается в milicores (1000 milicores = 1 CPU).<br/>Формат значения: целое число.<br/><br/>### Квота памяти пода<br/>Описание: Лимит оперативной памяти для одного узла. Указывается в megabytes.<br/>Формат значения: целое число.<br/><br/>### Размер диска под хранение секретов<br/>Описание: Объем диска для хранения данных. Фактический объем равен значению, умноженному на количество реплик. Указывается в Gigabytes<br/>Формат значения: целое число.<br/><br/>### Версия OpenBao<br/>Описание: Версия OpenBao для развертывания сервиса.<br/>Формат значения: выбор из предоставленного списка версий.<br/><br/>---<br/><br/>## 3. Рекомендованные характеристики<br/><br/>### Тестовое окружение<br/>Кол-во реплик: 2.<br/>Квота ядра пода: 200.<br/>Квота памяти пода: 256.<br/>Размер диска под хранение секретов: 1.<br/>Версия OpenBao: актуальная стабильная версия.<br/><br/>### Промышленное окружение<br/>Кол-во реплик: от 3.<br/>Квота ядра пода: от 1000.<br/>Квота памяти пода: от 1024.<br/>Размер диска под хранение секретов: от 10.<br/>Версия OpenBao: актуальная стабильная версия.<br/><br/>---<br/><br/>## 4. Выходные параметры<br/>Настройки внутри хранилища (kv/secrets/roles) — конфигурации Key/Value, секретов и ролей, созданные соответствующими операциями.<br/>Настройки самого хранилище (сайзинг, объемы) — параметры ресурсов и хранилища данных, примененные к сервису.<br/>Статус кластера (running / suspended) — текущее состояние работы кластера.<br/>url для подключения к веб — адрес веб-интерфейса сервиса.<br/><br/>---<br/><br/>## 5. Дополнительная информация<br/>При удалении хранилища все данные и настройки безвозвратно удаляются.<br/>При использовании доменного имени требуется корректная настройка DNS.<br/>Операции управления секретами и ролями выполняются только после успешного создания хранилища.<br/>Удаление кластера производится через операцию `suspend`, а удаление становится доступно через 14 дней после остановки кластера<br/>Правило выше не относится к операции `delete_kv` / `delete_secrets` / `delete_role`
|
||||
</div>
|
||||
@@ -0,0 +1,51 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Copy-ready manifest (`k8s_openbao_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_k8s_openbao" "baza" {
|
||||
resource_realm = "TODO" # Кластер Kubernetes в котором будет развёрнуто приложение
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
resource_cpu = 500 # Пример: `500`
|
||||
resource_instances = 3 # Пример: `3`
|
||||
resource_memory = 512 # Пример: `2048`
|
||||
resource_disk = 10 # Пример: `10`
|
||||
app_version = 2.4.4 # Выбрать из списка
|
||||
domain = "bao-" # Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_k8s_openbao.baza.state_params["имя_ключа"]
|
||||
nubes_k8s_openbao.baza.state_out["имя_ключа"]
|
||||
nubes_k8s_openbao.baza.state_params_flat["имя_ключа"]
|
||||
nubes_k8s_openbao.baza.state_out_flat["имя_ключа"]
|
||||
nubes_k8s_openbao.baza.vault_secrets["имя_ключа"]
|
||||
nubes_k8s_openbao.baza.vault_url
|
||||
nubes_k8s_openbao.baza.vault_user_path
|
||||
nubes_k8s_openbao.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,26 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](k8s_openbao_params_create.md)
|
||||
- `create_kv` — Создание кластера. Параметры: [Create params](k8s_openbao_params_create.md)
|
||||
- `create_policy` — Создание кластера. Параметры: [Create params](k8s_openbao_params_create.md)
|
||||
- `create_secrets` — Создание кластера. Параметры: [Create params](k8s_openbao_params_create.md)
|
||||
- `delete`
|
||||
- `delete_kv` — **ОСТОРОЖНО** Удаление KV подразумевает удаление ВСЕХ secrets внутри этой KV
|
||||
- `delete_policy`
|
||||
- `delete_secrets`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](k8s_openbao_params_modify.md)
|
||||
- `reconcile`
|
||||
- `recovery_secrets` — Данная операция подразумевает откат на конкретную версию в секрете. **Это не восстановление удалённого секрета**
|
||||
- `restart`
|
||||
- `resume`
|
||||
- `suspend`
|
||||
- `update_policy`
|
||||
- `update_secrets`
|
||||
@@ -0,0 +1,18 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](k8s_openbao_params_create.md)
|
||||
- [Modify params](k8s_openbao_params_modify.md)
|
||||
@@ -0,0 +1,41 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Create params
|
||||
|
||||
**Обязательные параметры (вводимые пользователем)**
|
||||
|
||||
<table class="resource-table resource-table-compact resource-table-required">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>663</td><td><strong><code class="code-no-wrap">resource_realm</code></strong></td><td><code>string</code></td><td>Выбрать платформу из списка<br/><br/>**Если список не отображается**<br/>обратитесь к сервис менеджеру с вопросом предоставления ресурсной платформы</td><td>func=getAvailableResourceRealms</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
**Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте**
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Default</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>664</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td><code>500</code></td><td>Указывается в Milicores<br/>`1000` Mili == `1` Ядро</td><td>minvalue=250; maxvalue=8000</td></tr>
|
||||
<tr><td>665</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td><code>3</code></td><td>Пример: `3`</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>666</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td><code>512</code></td><td>Указывается в Megabytes</td><td>minvalue=256; maxvalue=8192</td></tr>
|
||||
<tr><td>667</td><td><strong><code class="code-no-wrap">resource_disk</code></strong></td><td><code>integer</code></td><td><code>10</code></td><td>Указывается в Gigabytes</td><td>minvalue=1; maxvalue=999</td></tr>
|
||||
<tr><td>668</td><td><strong><code class="code-no-wrap">app_version</code></strong></td><td><code>string</code></td><td><code>2.4.4</code></td><td>Выбрать из списка</td><td>value_list=2.4.4</td></tr>
|
||||
<tr><td>669</td><td><strong><code class="code-no-wrap">domain</code></strong></td><td><code>string</code></td><td><code>bao-</code></td><td>Если будет указан FQDN, то происходят проверки DNS на валидность А-записи, или будет добавлено в зону resourceRealm</td><td>regex=^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$; unique_scope=provider</td></tr>
|
||||
</tbody></table>
|
||||
|
||||
<div class="lifecycle-note">
|
||||
<strong>Параметры поведения (кратко)</strong><br/>
|
||||
По умолчанию: `suspend_on_destroy = True`, `adopt_existing_on_create = False`.<br/>
|
||||
При `terraform destroy` или удалении ресурса из манифеста:<br/>
|
||||
- `suspend_on_destroy=true` — инстанс переводится в `Suspend` (не удаляется).<br/>
|
||||
- `suspend_on_destroy=false` — Terraform удаляет ресурс только из state.<br/>
|
||||
При `apply` флаг `adopt_existing_on_create` работает как авто-`import`:<br/>
|
||||
- `false` — если ресурс уже есть, будет ошибка.<br/>
|
||||
- `true` — Terraform может взять существующий инстанс под управление (`running` → adopt, `suspended` → resume+adopt при совпадении параметров).<br/>
|
||||
Важно: один инстанс должен быть только в одном state. Иначе получите конфликт управления.
|
||||
</div>
|
||||
@@ -0,0 +1,19 @@
|
||||
# Resource nubes_k8s_openbao
|
||||
|
||||
Service ID: `151`
|
||||
|
||||
Service Name: Vault
|
||||
|
||||
[Manual](k8s_openbao.md) | [Create params](k8s_openbao_params_create.md) | [Modify params](k8s_openbao_params_modify.md) | [Output params](k8s_openbao_outputs.md) | [Operations](k8s_openbao_ops.md) | [Example](k8s_openbao_example.md)
|
||||
|
||||
## Modify params
|
||||
|
||||
<table class="resource-table resource-table-compact">
|
||||
<thead><tr><th>ID</th><th>Code</th><th>Type</th><th>Description</th><th>Constraints</th></tr></thead>
|
||||
<tbody>
|
||||
<tr><td>670</td><td><strong><code class="code-no-wrap">resource_instances</code></strong></td><td><code>integer</code></td><td>Пример: `3`</td><td>minvalue=1; maxvalue=7</td></tr>
|
||||
<tr><td>671</td><td><strong><code class="code-no-wrap">resource_cpu</code></strong></td><td><code>integer</code></td><td>Указывается в Milicores<br/>`1000` Mili == `1` Ядро</td><td>minvalue=250; maxvalue=8000</td></tr>
|
||||
<tr><td>672</td><td><strong><code class="code-no-wrap">resource_memory</code></strong></td><td><code>integer</code></td><td>Указывается в Megabytes</td><td>minvalue=256; maxvalue=8192</td></tr>
|
||||
<tr><td>673</td><td><strong><code class="code-no-wrap">resource_disk</code></strong></td><td><code>integer</code></td><td>Указывается в Gigabytes</td><td>minvalue=1; maxvalue=999</td></tr>
|
||||
<tr><td>674</td><td><strong><code class="code-no-wrap">app_version</code></strong></td><td><code>string</code></td><td>Выбрать из списка</td><td>value_list=2.4.4</td></tr>
|
||||
</tbody></table>
|
||||
@@ -0,0 +1,13 @@
|
||||
# Resource nubes_k8s_sthutrval_cluster
|
||||
|
||||
Service ID: `150`
|
||||
|
||||
Service Name: Kubernetes кластер Штурвал
|
||||
|
||||
[Manual](k8s_sthutrval_cluster.md) | [Create params](k8s_sthutrval_cluster_params_create.md) | [Modify params](k8s_sthutrval_cluster_params_modify.md) | [Output params](k8s_sthutrval_cluster_outputs.md) | [Operations](k8s_sthutrval_cluster_ops.md) | [Example](k8s_sthutrval_cluster_example.md)
|
||||
|
||||
## MAN
|
||||
|
||||
<div class="man-content">
|
||||
Перед разворачиванием убедиться, что в облаке есть 2 свободных невыделенных IP в пуле
|
||||
</div>
|
||||
@@ -0,0 +1,49 @@
|
||||
# Resource nubes_k8s_sthutrval_cluster
|
||||
|
||||
Service ID: `150`
|
||||
|
||||
Service Name: Kubernetes кластер Штурвал
|
||||
|
||||
[Manual](k8s_sthutrval_cluster.md) | [Create params](k8s_sthutrval_cluster_params_create.md) | [Modify params](k8s_sthutrval_cluster_params_modify.md) | [Output params](k8s_sthutrval_cluster_outputs.md) | [Operations](k8s_sthutrval_cluster_ops.md) | [Example](k8s_sthutrval_cluster_example.md)
|
||||
|
||||
## Copy-ready manifest (`k8s_sthutrval_cluster_main.tf`)
|
||||
|
||||
```hcl
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.39"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Токен доступа api_token к Nubes API — замените на реальный.
|
||||
provider "nubes" {
|
||||
api_token = "token_***"
|
||||
api_endpoint = "https://deck-api.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
resource "nubes_k8s_sthutrval_cluster" "baza" {
|
||||
startup_configuration = "TODO"
|
||||
control_plane_configuration = "TODO"
|
||||
access_configuration = "TODO"
|
||||
cluster_configuration = "TODO"
|
||||
|
||||
# Параметры, имеющие значение по умолчанию, если не меняете - эти параметры не обязательно прописывать в манифесте
|
||||
worker_configuration = [{}]
|
||||
}
|
||||
```
|
||||
|
||||
## Outputs usage
|
||||
|
||||
```hcl
|
||||
# Выходные параметры можно использовать как
|
||||
nubes_k8s_sthutrval_cluster.baza.state_params["имя_ключа"]
|
||||
nubes_k8s_sthutrval_cluster.baza.state_out["имя_ключа"]
|
||||
nubes_k8s_sthutrval_cluster.baza.state_params_flat["имя_ключа"]
|
||||
nubes_k8s_sthutrval_cluster.baza.state_out_flat["имя_ключа"]
|
||||
nubes_k8s_sthutrval_cluster.baza.vault_secrets["имя_ключа"]
|
||||
nubes_k8s_sthutrval_cluster.baza.vault_url
|
||||
nubes_k8s_sthutrval_cluster.baza.vault_user_path
|
||||
nubes_k8s_sthutrval_cluster.baza.vault_fields
|
||||
```
|
||||
@@ -0,0 +1,17 @@
|
||||
# Resource nubes_k8s_sthutrval_cluster
|
||||
|
||||
Service ID: `150`
|
||||
|
||||
Service Name: Kubernetes кластер Штурвал
|
||||
|
||||
[Manual](k8s_sthutrval_cluster.md) | [Create params](k8s_sthutrval_cluster_params_create.md) | [Modify params](k8s_sthutrval_cluster_params_modify.md) | [Output params](k8s_sthutrval_cluster_outputs.md) | [Operations](k8s_sthutrval_cluster_ops.md) | [Example](k8s_sthutrval_cluster_example.md)
|
||||
|
||||
## Operations
|
||||
|
||||
- `create` — Создание кластера. Параметры: [Create params](k8s_sthutrval_cluster_params_create.md)
|
||||
- `delete`
|
||||
- `modify` — Изменение кластера. Параметры: [Modify params](k8s_sthutrval_cluster_params_modify.md)
|
||||
- `reconcile`
|
||||
- `resume`
|
||||
- `suspend`
|
||||
- `update_secrets`
|
||||
@@ -0,0 +1,33 @@
|
||||
# Resource nubes_k8s_sthutrval_cluster
|
||||
|
||||
Service ID: `150`
|
||||
|
||||
Service Name: Kubernetes кластер Штурвал
|
||||
|
||||
[Manual](k8s_sthutrval_cluster.md) | [Create params](k8s_sthutrval_cluster_params_create.md) | [Modify params](k8s_sthutrval_cluster_params_modify.md) | [Output params](k8s_sthutrval_cluster_outputs.md) | [Operations](k8s_sthutrval_cluster_ops.md) | [Example](k8s_sthutrval_cluster_example.md)
|
||||
|
||||
## Output params
|
||||
|
||||
- `state_params` (map) — параметры, отправленные в API при создании/изменении
|
||||
- `state_out` (map) — ответ API с результатами/выходными значениями
|
||||
- `state_params_flat` (map) — параметры в плоском виде (ключи с путями)
|
||||
- `state_out_flat` (map) — ответы в плоском виде (ключи с путями)
|
||||
- `vault_secrets` (map) — секреты, записанные в Vault для ресурса
|
||||
- `vault_url` (string) — адрес Vault для ресурса
|
||||
- `vault_user_path` (string) — путь пользователя в Vault
|
||||
- `vault_fields` (list) — список ключей доступных секретов
|
||||
|
||||
## Реальные поля из облака (running/suspended snapshot)
|
||||
|
||||
Поля ниже получены из реальных инстансов этого сервиса в облаке.
|
||||
Используйте их как готовые ключи для `state_out_flat` и `vault_secrets`.
|
||||
|
||||
### `state_out_flat` ключи
|
||||
|
||||
- `state_out_flat["ingressAddress"]`
|
||||
- `state_out_flat["kubernetesApiAddress"]`
|
||||
|
||||
### `vault_secrets` ключи
|
||||
|
||||
- `vault_secrets["kubernetesAdminConfigB64"]`
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# Resource nubes_k8s_sthutrval_cluster
|
||||
|
||||
Service ID: `150`
|
||||
|
||||
Service Name: Kubernetes кластер Штурвал
|
||||
|
||||
[Manual](k8s_sthutrval_cluster.md) | [Create params](k8s_sthutrval_cluster_params_create.md) | [Modify params](k8s_sthutrval_cluster_params_modify.md) | [Output params](k8s_sthutrval_cluster_outputs.md) | [Operations](k8s_sthutrval_cluster_ops.md) | [Example](k8s_sthutrval_cluster_example.md)
|
||||
|
||||
## Parameters
|
||||
|
||||
- [Create params](k8s_sthutrval_cluster_params_create.md)
|
||||
- [Modify params](k8s_sthutrval_cluster_params_modify.md)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user