diff --git a/VM/README.md b/VM/README.md index d5fe144..62ffed4 100644 --- a/VM/README.md +++ b/VM/README.md @@ -3,52 +3,86 @@ Создаёт: - **vApp** — виртуальный каталог (контейнер для ВМ в VMware vDC) - **ВМ** — Ubuntu 22.04, 2 CPU / 2 GB RAM / 20 GB disk +- **Serverless-джобы** — устанавливают ПО на ВМ по SSH после создания --- -## Что нужно сделать перед запуском - -### 1. Сгенерировать SSH-ключ - -Публичный ключ прописывается в ВМ при создании — это единственный способ зайти по SSH. -Приватный ключ нужен хранить у себя. +## Быстрый старт ```bash -ssh-keygen -t ed25519 -f ~/.ssh/sless-demo-vm -N "" -C "sless-demo-vm" +cp terraform.tfvars.template terraform.tfvars +# Заполни terraform.tfvars (инструкция ниже) +terraform init +terraform apply ``` -Публичный ключ (`~/.ssh/sless-demo-vm.pub`) — строка вида: -``` -ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... sless-demo-vm +--- + +## Шаг 1 — Получить данные из Личного Кабинета + +### API-токен + +> Личный Кабинет → правый верхний угол → **«Профиль»** → **«API-токены»** → **«Создать токен»** + +Скопируйте JWT-строку целиком (`eyJhbGciOiJS...`). +Один токен работает для обоих провайдеров — nubes (облако) и sless (serverless). + +### UUID сервисов (vdc_uid и nsxt_uid) + +> Личный Кабинет → **«Мои сервисы»** → нужный сервис → **«Параметры инстанса»** → поле UUID + +| Параметр | Что искать в ЛК | +|---|---| +| `vdc_uid` | Сервис **«Виртуальный датацентр (vDC)»** → UUID | +| `nsxt_uid` | Сервис **«Сетевой шлюз периметра (Edge)»** → UUID | + +UUID выглядит так: `e3c9e4f1-24da-4992-a003-f8a2a803a5f0` + +> **Важно:** `vdc_uid` и `nsxt_uid` **не изменяются после первого `terraform apply`**. +> Менять их нельзя — сломается terraform state. + +--- + +## Шаг 2 — Сгенерировать SSH-ключ для ВМ + +Публичный ключ прописывается в ВМ при создании — это **единственный** способ зайти по SSH. + +```bash +# Выполнить в папке examples/VM/ +ssh-keygen -t ed25519 -f ./vm_key -N "" -C "sless-demo-vm" ``` -### 2. Заполнить terraform.tfvars +Создаст два файла: `vm_key` (приватный) и `vm_key.pub` (публичный). -Открыть файл `terraform.tfvars` и заменить значения: +--- + +## Шаг 3 — Заполнить terraform.tfvars + +```bash +cp terraform.tfvars.template terraform.tfvars +``` + +Открыть `terraform.tfvars` и заполнить: ```hcl -# Ваш API-токен из панели Nubes -api_token = "ВСТАВИТЬ_ТОКЕН" - -# Публичный ключ из шага 1 -vm_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..." +api_token = "eyJhbGciOiJS..." # из ЛК (шаг 1) +vm_public_key = "ssh-ed25519 AAAA..." # содержимое vm_key.pub (шаг 2) +vdc_uid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # из ЛК (шаг 1) +nsxt_uid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" # из ЛК (шаг 1) ``` -> **Токен** — берётся в панели Nubes: профиль → API-токены. -> **Ключ** — содержимое файла `~/.ssh/sless-demo-vm.pub` (публичный, не приватный!). +Остальные параметры (`install_packages`, `base_packages` и т.д.) можно менять в любое время. --- ## Запуск ```bash -cd examples/VM - terraform init terraform apply ``` -После `apply` в выводе будет: +После успешного `apply` Terraform выведет: ``` Outputs: @@ -66,10 +100,58 @@ vapp_id = "..." ## Подключение по SSH ```bash -ssh -i ~/.ssh/sless-demo-vm ubuntu@ +ssh -i ./vm_key ubuntu@ ``` -Логин — `ubuntu` (задан в `vm.tf`). +Логин всегда `ubuntu`. + +--- + +## Управление установкой ПО + +Установка выполняется через serverless-джобы — Terraform запускает k8s Job, который подключается к ВМ по SSH и устанавливает пакеты. + +### Флаги установки (в terraform.tfvars) + +| Переменная | Что делает | По умолчанию | +|---|---|---| +| `install_packages` | Устанавливает пакеты из `base_packages` | `true` | +| `install_nginx` | Устанавливает nginx | `true` | +| `install_docker` | Устанавливает Docker CE + docker-compose-plugin | `true` | + +### Как изменить список пакетов + +В `terraform.tfvars`: + +```hcl +base_packages = ["jq", "htop", "curl", "git", "python3-pip"] +``` + +Любые стандартные apt-пакеты Ubuntu 22.04. +После изменения — увеличьте `install_run_id` и выполните `terraform apply`. + +### Как перезапустить установку + +sless_job — разовый джоб. При повторном `apply` Terraform не перезапускает его если ничего не изменилось. +Чтобы запустить все install-джобы заново — увеличьте `install_run_id` на 1: + +```hcl +# было: +install_run_id = 3 +# стало: +install_run_id = 4 +``` + +Затем `terraform apply`. Установка идемпотентна — повторное выполнение не ломает систему. + +### Как отключить отдельный компонент + +```hcl +install_docker = false # не устанавливать Docker +``` + +После `apply` ресурс `sless_job.install_docker` будет удалён из state. +Docker на уже созданной ВМ останется — Terraform не удаляет пакеты. --- @@ -79,15 +161,44 @@ ssh -i ~/.ssh/sless-demo-vm ubuntu@ terraform destroy ``` -Порядок автоматический: сначала suspend → потом delete. Без suspend удаление упадёт с ошибкой — это поведение Nubes, параметр `suspend_on_destroy = true` в ресурсах решает это. +Порядок автоматический: сначала suspend → потом delete. +Параметр `suspend_on_destroy = true` решает это — без него удаление упадёт с ошибкой Nubes _«Услуга не остановлена»_. --- -## Что можно менять +## Справочник параметров -| Параметр | Файл | Примечание | -|----------|------|-----------| -| `vm_cpu`, `vm_ram`, `vm_disk` | `vm.tf` | Можно менять и переприменять | -| `resource_name`, `vapp_name` | `vapp.tf` | **Не изменяется после создания** | -| `image_vm`, `user_login`, `user_public_key` | `vm.tf` | **Не изменяется после создания** | -| `vdc_uid`, `nsxt_uid` | `vapp.tf` | **Не изменяется после создания** | +### Можно менять в любое время + +| Параметр | Файл | Эффект | +|---|---|---| +| `vm_cpu`, `vm_ram`, `vm_disk` | `vm.tf` | ВМ будет изменена | +| `install_packages/nginx/docker` | `terraform.tfvars` | Джоб добавится или удалится | +| `base_packages` | `terraform.tfvars` | Пакеты изменятся — увеличить `install_run_id` + apply | +| `install_run_id` | `terraform.tfvars` | Перезапускает все install-джобы | + +### Нельзя менять после первого apply + +| Параметр | Файл | Причина | +|---|---|---| +| `vdc_uid`, `nsxt_uid` | `terraform.tfvars` | Идентифицируют сервисы в terraform state | +| `resource_name`, `vapp_name` | `vapp.tf` | Уникальные имена ресурсов в Nubes | +| `image_vm`, `user_login` | `vm.tf` | Неизменяемые параметры ВМ | +| `vm_public_key` | `terraform.tfvars` | Прописывается в ВМ один раз при создании | + +--- + +## Файлы проекта + +| Файл | Назначение | +|---|---| +| `terraform.tfvars.template` | **Шаблон** — скопировать в `terraform.tfvars` и заполнить | +| `terraform.tfvars` | Ваши значения (не в git — содержит секреты) | +| `main.tf` | Провайдеры + переменные `api_token` и `vm_public_key` | +| `variables.tf` | Все остальные переменные с описаниями | +| `vapp.tf` | Ресурс vApp (контейнер ВМ) | +| `vm.tf` | Ресурс ВМ (Ubuntu 22.04) | +| `sless.tf` | Serverless-джобы для установки ПО | +| `outputs.tf` | Вывод IP-адреса и ID ресурсов | +| `vm_key` / `vm_key.pub` | SSH-ключ для доступа к ВМ | +| `functions/` | Код Python-функций для install-джобов | diff --git a/VM/terraform.tfvars.template b/VM/terraform.tfvars.template new file mode 100644 index 0000000..414e100 --- /dev/null +++ b/VM/terraform.tfvars.template @@ -0,0 +1,112 @@ +# ============================================================================= +# terraform.tfvars.template — шаблон конфигурации примера «ВМ в Nubes vDC» +# ============================================================================= +# +# Скопируйте этот файл в terraform.tfvars и заполните все значения: +# +# cp terraform.tfvars.template terraform.tfvars +# +# terraform.tfvars НЕ коммитится в git (защищён .gitignore) — +# он содержит секретные данные (API-токен, SSH-ключ). +# ============================================================================= + + +# ============================================================================= +# 1. API-ТОКЕН +# ============================================================================= +# +# Один токен для обоих провайдеров: nubes (облако) и sless (serverless). +# +# Где взять: +# Личный Кабинет Nubes → правый верхний угол → «Профиль» → «API-токены» +# → кнопка «Создать токен» → скопируйте JWT-строку целиком. +# +# Токен выглядит так: eyJhbGciOiJS...длинная строка... +# Вставьте в кавычки целиком, не разбивая на строки. +# +api_token = "ВСТАВИТЬ_API_ТОКЕН" + + +# ============================================================================= +# 2. SSH-КЛЮЧ ДЛЯ ВМ +# ============================================================================= +# +# Публичный ключ прописывается в ВМ при создании. +# Приватный ключ нужен для SSH-подключения к ВМ. +# +# Как сгенерировать: +# ssh-keygen -t ed25519 -f ./vm_key -N "" -C "sless-demo-vm" +# # Создаст два файла: vm_key (приватный) и vm_key.pub (публичный) +# +# vm_key.pub уже есть в папке — скопируйте его содержимое сюда. +# Строка выглядит так: ssh-ed25519 AAAA... имя-ключа +# +vm_public_key = "ВСТАВИТЬ_ПУБЛИЧНЫЙ_SSH_КЛЮЧ" + + +# ============================================================================= +# 3. UUID СЕРВИСОВ NUBES (вdc_uid и nsxt_uid) +# ============================================================================= +# +# Где взять: +# Личный Кабинет → «Мои сервисы» → найдите нужный сервис → раздел +# «Параметры инстанса» или «Технические параметры» → UUID. +# +# vdc_uid — это UUID услуги «Виртуальный датацентр (vDC)» +# Пример раздела ЛК: Мои сервисы → vDC → [ваш vDC] → UUID +# +# nsxt_uid — это UUID услуги «Сетевой шлюз периметра (Edge)» +# Пример раздела ЛК: Мои сервисы → Edge → [ваш Edge] → UUID +# +# Формат: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx (UUID v4) +# +# ВАЖНО: эти значения не изменяются после создания vApp. +# После первого terraform apply менять их нельзя — сломает state. +# +vdc_uid = "ВСТАВИТЬ_UUID_VDC" +nsxt_uid = "ВСТАВИТЬ_UUID_NSXT" + + +# ============================================================================= +# 4. ФЛАГИ УСТАНОВКИ ПО НА ВМ +# ============================================================================= +# +# Что устанавливать при terraform apply. +# Установка выполняется через serverless-джобы (sless_job) по SSH на ВМ. +# Каждый флаг — отдельный джоб, они выполняются независимо. +# +# true = установить +# false = не устанавливать (ресурс не создаётся вовсе) +# +install_packages = true # базовые apt-пакеты из списка base_packages ниже +install_nginx = true # nginx (веб-сервер) +install_docker = true # Docker CE + docker-compose-plugin + + +# ============================================================================= +# 5. СПИСОК БАЗОВЫХ ПАКЕТОВ +# ============================================================================= +# +# Эти пакеты устанавливаются когда install_packages = true. +# Любые стандартные apt-пакеты Ubuntu 22.04. +# +# Как изменить список: +# - Добавьте пакет: base_packages = ["jq", "htop", "curl", "git"] +# - Удалите пакет: уберите его из списка +# - После изменения: увеличьте install_run_id (см. ниже) и terraform apply +# +base_packages = ["jq", "python3-pip", "htop", "unzip"] + + +# ============================================================================= +# 6. RUN_ID — триггер повторного запуска джобов +# ============================================================================= +# +# sless_job — это разовые джобы (k8s Job). Terraform не перезапускает их +# автоматически если код не изменился. Чтобы запустить ВСЕ install-джобы +# заново (например, после изменения base_packages) — увеличьте это число на 1 +# и выполните terraform apply. +# +# Например: было install_run_id = 3 → стало install_run_id = 4 → apply +# +install_run_id = 1 diff --git a/VM/vapp.tf b/VM/vapp.tf index e6620e9..171447b 100644 --- a/VM/vapp.tf +++ b/VM/vapp.tf @@ -4,9 +4,9 @@ resource "nubes_vapp" "vapp" { resource_name = "vm-sless-vapp" - vapp_name = "vapp-sless" # Уникальное в рамках организации. Не изменяется после создания. - vdc_uid = "e3c9e4f1-24da-4992-a003-f8a2a803a5f0" # UUID Услуги «Виртуальный датацентр (vDC)». Не изменяется после создания. - nsxt_uid = "0fe88e2a-31b6-4385-ad52-e27c6c0d38a6" # UUID Услуги «Сетевой шлюз периметра (Edge)». Не изменяется после создания. + vapp_name = "vapp-sless" # Уникальное в рамках организации. Не изменяется после создания. + vdc_uid = var.vdc_uid # UUID Услуги «Виртуальный датацентр (vDC)». В terraform.tfvars. + nsxt_uid = var.nsxt_uid # UUID Услуги «Сетевой шлюз периметра (Edge)». В terraform.tfvars. adopt_existing_on_create = true operation_timeout = "15m" diff --git a/VM/variables.tf b/VM/variables.tf index de95a50..c99eaf7 100644 --- a/VM/variables.tf +++ b/VM/variables.tf @@ -35,3 +35,17 @@ variable "install_run_id" { default = 1 description = "Увеличь на 1 чтобы запустить все install-джобы заново" } + +# ---- Идентификаторы сервисов Nubes ---------------------------------------- +# Берутся из Личного Кабинета → «Мои сервисы» → нужный сервис → параметры инстанса. +# Не изменяются после создания vApp. + +variable "vdc_uid" { + type = string + description = "UUID услуги «Виртуальный датацентр (vDC)». Личный Кабинет → Мои сервисы → vDC → UUID." +} + +variable "nsxt_uid" { + type = string + description = "UUID услуги «Сетевой шлюз периметра (Edge / NSX-T)». Личный Кабинет → Мои сервисы → Edge → UUID." +}