feat(vm): add vApp + VM terraform example
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# Пример: Виртуальная машина (vApp + VM) в Nubes vDC
|
||||
|
||||
Создаёт:
|
||||
- **vApp** — виртуальный каталог (контейнер для ВМ в VMware vDC)
|
||||
- **ВМ** — Ubuntu 22.04, 2 CPU / 2 GB RAM / 20 GB disk
|
||||
|
||||
---
|
||||
|
||||
## Что нужно сделать перед запуском
|
||||
|
||||
### 1. Сгенерировать SSH-ключ
|
||||
|
||||
Публичный ключ прописывается в ВМ при создании — это единственный способ зайти по SSH.
|
||||
Приватный ключ нужен хранить у себя.
|
||||
|
||||
```bash
|
||||
ssh-keygen -t ed25519 -f ~/.ssh/sless-demo-vm -N "" -C "sless-demo-vm"
|
||||
```
|
||||
|
||||
Публичный ключ (`~/.ssh/sless-demo-vm.pub`) — строка вида:
|
||||
```
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... sless-demo-vm
|
||||
```
|
||||
|
||||
### 2. Заполнить terraform.tfvars
|
||||
|
||||
Открыть файл `terraform.tfvars` и заменить значения:
|
||||
|
||||
```hcl
|
||||
# Ваш API-токен из панели Nubes
|
||||
api_token = "ВСТАВИТЬ_ТОКЕН"
|
||||
|
||||
# Публичный ключ из шага 1
|
||||
vm_public_key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA..."
|
||||
```
|
||||
|
||||
> **Токен** — берётся в панели Nubes: профиль → API-токены.
|
||||
> **Ключ** — содержимое файла `~/.ssh/sless-demo-vm.pub` (публичный, не приватный!).
|
||||
|
||||
---
|
||||
|
||||
## Запуск
|
||||
|
||||
```bash
|
||||
cd examples/VM
|
||||
|
||||
terraform init
|
||||
terraform apply
|
||||
```
|
||||
|
||||
После `apply` в выводе будет:
|
||||
|
||||
```
|
||||
Outputs:
|
||||
|
||||
vm_id = "..."
|
||||
vm_state = {
|
||||
"externalIp" = "1.2.3.4"
|
||||
...
|
||||
}
|
||||
vapp_id = "..."
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Подключение по SSH
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/sless-demo-vm ubuntu@<externalIp из outputs>
|
||||
```
|
||||
|
||||
Логин — `ubuntu` (задан в `vm.tf`).
|
||||
|
||||
---
|
||||
|
||||
## Удаление
|
||||
|
||||
```bash
|
||||
terraform destroy
|
||||
```
|
||||
|
||||
Порядок автоматический: сначала suspend → потом delete. Без suspend удаление упадёт с ошибкой — это поведение Nubes, параметр `suspend_on_destroy = true` в ресурсах решает это.
|
||||
|
||||
---
|
||||
|
||||
## Что можно менять
|
||||
|
||||
| Параметр | Файл | Примечание |
|
||||
|----------|------|-----------|
|
||||
| `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` | **Не изменяется после создания** |
|
||||
@@ -0,0 +1,38 @@
|
||||
// 2026-03-25 — main.tf для примера с vApp + ВМ (Виртуальный датацентр Nubes).
|
||||
// Провайдер nubes. Sless-провайдер не нужен — пример чисто инфраструктурный.
|
||||
|
||||
terraform {
|
||||
required_providers {
|
||||
nubes = {
|
||||
source = "terra.k8c.ru/nubes/nubes"
|
||||
version = "5.0.31"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Переменные
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
variable "vm_public_key" {
|
||||
type = string
|
||||
sensitive = true
|
||||
description = "Публичный SSH-ключ для ВМ. Приватный ключ: ~/terra/sless/examples/VM/vm_key"
|
||||
}
|
||||
|
||||
variable "api_token" {
|
||||
type = string
|
||||
sensitive = true
|
||||
description = "Nubes API token"
|
||||
}
|
||||
|
||||
# ------------------------------------------------------------------
|
||||
# Провайдер
|
||||
# ------------------------------------------------------------------
|
||||
|
||||
# API Dashboard (для Terraform-провайдеров): https://deck-api-test.ngcloud.ru/api/v1/index.cfm
|
||||
# UI облака (только браузер): https://deck-test.ngcloud.ru/
|
||||
provider "nubes" {
|
||||
api_token = var.api_token
|
||||
api_endpoint = "https://deck-api-test.ngcloud.ru/api/v1/index.cfm"
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// 2026-03-25 — vapp.tf: виртуальный каталог ВМ (vApp) в Nubes vDC.
|
||||
// nubes_vapp — контейнер для ВМ внутри Виртуального датацентра.
|
||||
// Обязательные поля: vdc_uid, nsxt_uid, vapp_name, resource_name.
|
||||
|
||||
resource "nubes_vapp" "vapp" {
|
||||
resource_name = "vm-sless-demo-vapp"
|
||||
vapp_name = "vapp-sless-demo" # Уникальное в рамках организации. Не изменяется после создания.
|
||||
vdc_uid = "e3c9e4f1-24da-4992-a003-f8a2a803a5f0" # UUID Услуги «Виртуальный датацентр (vDC)». Не изменяется после создания.
|
||||
nsxt_uid = "0fe88e2a-31b6-4385-ad52-e27c6c0d38a6" # UUID Услуги «Сетевой шлюз периметра (Edge)». Не изменяется после создания.
|
||||
|
||||
adopt_existing_on_create = true
|
||||
operation_timeout = "15m"
|
||||
|
||||
# ВАЖНО: delete без предварительного suspend завершается ошибкой
|
||||
# "Невозможно выполнить операцию удаления услуги. Услуга не остановлена"
|
||||
# suspend_on_destroy гарантирует правильный порядок: suspend → delete.
|
||||
suspend_on_destroy = true
|
||||
}
|
||||
|
||||
output "vapp_id" {
|
||||
value = nubes_vapp.vapp.id
|
||||
description = "ID созданного vApp (используется как vapp_uid при создании ВМ)"
|
||||
}
|
||||
|
||||
output "vapp_state" {
|
||||
value = nubes_vapp.vapp.state_out_flat
|
||||
description = "Плоский state vApp — адреса, статусы сети и т.д."
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
// 2026-03-25 — vm.tf: виртуальная машина (nubes_vc_vm_v3) внутри vApp.
|
||||
// Зависит от nubes_vapp.vapp — создаётся после vApp.
|
||||
// image_vm, vapp_uid, user_public_key не изменяются после создания.
|
||||
|
||||
resource "nubes_vc_vm_v3" "vm" {
|
||||
resource_name = "vm-sless-demo"
|
||||
|
||||
vapp_uid = nubes_vapp.vapp.id # ссылка на vApp. Не изменяется после создания.
|
||||
image_vm = "Ubuntu 22.04 LTS" # Не изменяется после создания.
|
||||
ip_space_name = "internet-ipv4-v1"
|
||||
|
||||
user_login = "ubuntu"
|
||||
user_public_key = var.vm_public_key # задаётся в terraform.tfvars
|
||||
|
||||
vm_cpu = 2
|
||||
vm_ram = 2 # GB
|
||||
vm_disk = 20 # GB
|
||||
|
||||
adopt_existing_on_create = true
|
||||
operation_timeout = "15m"
|
||||
|
||||
# delete без предварительного suspend завершается ошибкой (аналогично vApp).
|
||||
suspend_on_destroy = true
|
||||
}
|
||||
|
||||
output "vm_id" {
|
||||
value = nubes_vc_vm_v3.vm.id
|
||||
description = "ID созданной ВМ"
|
||||
}
|
||||
|
||||
output "vm_state" {
|
||||
value = nubes_vc_vm_v3.vm.state_out_flat
|
||||
description = "Плоский state ВМ — IP-адреса, статус и т.д."
|
||||
}
|
||||
Reference in New Issue
Block a user