292 lines
7.8 KiB
Markdown
292 lines
7.8 KiB
Markdown
# Начало работы с Nubes Terraform (TEST)
|
||
|
||
Это руководство поможет вам установить Terraform и развернуть первую инфраструктуру в облаке Nubes (тестовый стенд).
|
||
|
||
## 0. Установка Terraform
|
||
|
||
Версия 1.0 или выше.
|
||
|
||
1. **Скачать**: [hashicorp.com/terraform/install](https://developer.hashicorp.com/terraform/install) или [Yandex Cloud Mirror](https://hashicorp-releases.yandexcloud.net/terraform/) (без VPN)
|
||
2. **Установить**: распаковать, положить `terraform` в `PATH`
|
||
3. **Проверить**: `terraform -version`
|
||
|
||
---
|
||
|
||
## 1. Конфигурация провайдера
|
||
|
||
Создайте `main.tf`:
|
||
|
||
```hcl
|
||
terraform {
|
||
required_providers {
|
||
nubes = {
|
||
source = "registry.kube5s.ru/nubes-test/nubes"
|
||
version = "5.1.2"
|
||
}
|
||
}
|
||
}
|
||
|
||
provider "nubes" {
|
||
api_endpoint = "https://lk-api-gateway-test.ngcloud.ru/api/v1/svc"
|
||
api_token = var.api_token
|
||
}
|
||
|
||
variable "api_token" {
|
||
type = string
|
||
sensitive = true
|
||
}
|
||
```
|
||
|
||
!!! info "TEST стенд"
|
||
- Личный кабинет: [https://deck-test.ngcloud.ru/dashboard/](https://deck-test.ngcloud.ru/dashboard/)
|
||
- API: `https://lk-api-gateway-test.ngcloud.ru/api/v1/svc`
|
||
|
||
!!! tip "Безопасность"
|
||
Не храните токен в `main.tf`. Используйте `terraform.tfvars` или переменные окружения.
|
||
|
||
---
|
||
|
||
## 2. Получение API токена
|
||
|
||
1. Зайдите в Личный кабинет → Профиль → Токены
|
||
2. Нажмите «Выпустить тех-токен»
|
||
3. **Сохраните токен** — он показывается только один раз
|
||
|
||
Создайте `terraform.tfvars`:
|
||
|
||
```hcl
|
||
api_token = "eyJhbGciOi..." # Ваш токен
|
||
```
|
||
|
||
---
|
||
|
||
## 3. Команды Terraform
|
||
|
||
### `terraform init`
|
||
Загружает провайдер. Выполняется **один раз** при старте проекта. При смене версии — `terraform init -upgrade`.
|
||
|
||
```bash
|
||
terraform init
|
||
```
|
||
|
||
### `terraform plan`
|
||
Показывает что будет создано/изменено/удалено. Безопасно, ничего не меняет.
|
||
|
||
```bash
|
||
terraform plan
|
||
```
|
||
|
||
### `terraform apply`
|
||
Применяет изменения. Создаёт/меняет/удаляет ресурсы в облаке.
|
||
|
||
```bash
|
||
terraform apply
|
||
# или сразу без подтверждения:
|
||
terraform apply -auto-approve
|
||
```
|
||
|
||
### `terraform destroy`
|
||
Удаляет ВСЕ ресурсы из манифеста.
|
||
|
||
```bash
|
||
terraform destroy
|
||
```
|
||
|
||
!!! warning "Suspend vs Destroy"
|
||
По умолчанию `terraform destroy` **не удаляет** инстанс — переводит в `Suspend`. См. раздел 5.
|
||
|
||
### `terraform state list` / `terraform state show`
|
||
Просмотр ресурсов под управлением Terraform.
|
||
|
||
```bash
|
||
terraform state list
|
||
terraform state show nubes_postgres.baza
|
||
```
|
||
|
||
---
|
||
|
||
## 4. Примеры ресурсов
|
||
|
||
### PostgreSQL
|
||
|
||
Скопируйте из [примера PostgreSQL](postgres_example.md) — заполните `TODO` своими значениями.
|
||
|
||
```hcl
|
||
resource "nubes_postgres" "baza" {
|
||
resource_name = "pg-tst01"
|
||
|
||
cluster_configuration {
|
||
cpu = 500
|
||
memory = 512
|
||
replicas = 1
|
||
disk = 10
|
||
}
|
||
|
||
startup_configuration {
|
||
resource_realm = "k8s-3-sandbox-nubes-ru"
|
||
}
|
||
|
||
access_configuration {
|
||
master_access_list = jsonencode(["10.0.0.0/8"])
|
||
master_ip_space = "no-needed"
|
||
slave_access_list = jsonencode([])
|
||
slave_ip_space = "no-needed"
|
||
}
|
||
|
||
postgres_configuration {
|
||
version = "17"
|
||
ssl_required = true
|
||
pooler_master = false
|
||
pooler_slave = false
|
||
}
|
||
|
||
backup_configuration {
|
||
s3_uid = "UUID-вашего-S3" # Обязательно
|
||
retain = 7
|
||
schedule = "0 0 * * *"
|
||
}
|
||
|
||
autoscale_configuration {
|
||
enabled = false
|
||
schedule = 0
|
||
percent = 10
|
||
quota = 100
|
||
}
|
||
}
|
||
```
|
||
|
||
### S3 Bucket
|
||
|
||
```hcl
|
||
resource "nubes_s3bucket" "my_files" {
|
||
resource_name = "bucket_0"
|
||
bucket_name = "my-unique-bucket-name"
|
||
s3_user_uid = "UUID-вашего-S3"
|
||
}
|
||
```
|
||
|
||
Подробные примеры — в разделе **Ресурсы** (левое меню), вкладка **Example** у каждого ресурса.
|
||
|
||
---
|
||
|
||
## 5. Suspend, Adopt и жизненный цикл
|
||
|
||
Провайдер **не удаляет** инстансы при `terraform destroy` по умолчанию. Вместо этого переводит в `Suspend`.
|
||
|
||
### `suspend_on_destroy` (по умолчанию `true`)
|
||
|
||
| Значение | `terraform destroy` | Удаление из манифеста |
|
||
|----------|--------------------|-----------------------|
|
||
| `true` | Инстанс → `Suspend` | Инстанс → `Suspend` |
|
||
| `false` | Только удаление из state | Только удаление из state |
|
||
|
||
### `adopt_existing_on_create` (по умолчанию `false`)
|
||
|
||
| Значение | Поведение при `apply` |
|
||
|----------|-----------------------|
|
||
| `false` | Если инстанс уже есть → ошибка |
|
||
| `true` | `running` → adopt под управление; `suspended` + совпадение параметров → resume + adopt |
|
||
|
||
### `operation_timeout`
|
||
|
||
Таймаут ожидания операции. По умолчанию `"10m"`. Для долгих операций можно увеличить:
|
||
|
||
```hcl
|
||
operation_timeout = "15m"
|
||
```
|
||
|
||
!!! warning "Один инстанс — один state"
|
||
Не подключайте один инстанс к двум манифестам — получите конфликт управления.
|
||
|
||
---
|
||
|
||
## 6. Связка сервисов (Lucee + PostgreSQL)
|
||
|
||
```hcl
|
||
resource "nubes_postgres" "db2" {
|
||
resource_name = "pg-tst0"
|
||
|
||
startup_configuration {
|
||
resource_realm = "k8s-3-sandbox-nubes-ru"
|
||
}
|
||
|
||
cluster_configuration {
|
||
cpu = 500
|
||
memory = 512
|
||
replicas = 1
|
||
disk = 10
|
||
}
|
||
|
||
access_configuration {
|
||
master_access_list = jsonencode(["10.0.0.0/8"])
|
||
master_ip_space = "no-needed"
|
||
slave_access_list = jsonencode([])
|
||
slave_ip_space = "no-needed"
|
||
}
|
||
|
||
postgres_configuration {
|
||
version = "17"
|
||
ssl_required = true
|
||
pooler_master = false
|
||
pooler_slave = false
|
||
}
|
||
|
||
backup_configuration {
|
||
s3_uid = "UUID-вашего-S3"
|
||
retain = 7
|
||
schedule = "0 0 * * *"
|
||
}
|
||
|
||
autoscale_configuration {
|
||
enabled = false
|
||
schedule = 0
|
||
percent = 10
|
||
quota = 100
|
||
}
|
||
}
|
||
|
||
resource "nubes_lucee" "app1" {
|
||
resource_name = "lucy1"
|
||
resource_realm = nubes_postgres.db2.startup_configuration.resource_realm
|
||
domain = "web03"
|
||
git_path = "https://github.com/user/repo.git"
|
||
|
||
json_env = jsonencode({
|
||
testds_class = "org.postgresql.Driver"
|
||
testds_bundleName = "org.postgresql.jdbc"
|
||
testds_bundleVersion = "42.6.0"
|
||
testds_connectionString = "jdbc:postgresql://$${nubes_postgres.db2.state_out_flat[\"internalConnect.master\"]}:5432/postgres"
|
||
testds_username = nubes_postgres.db2.vault_secrets["adminUser"]
|
||
testds_password = nubes_postgres.db2.vault_secrets["adminPass"]
|
||
})
|
||
|
||
app_version = "5.4"
|
||
|
||
depends_on = [nubes_postgres.db2]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 7. Типичный рабочий процесс
|
||
|
||
```bash
|
||
# 1. Клонируем/создаём проект
|
||
mkdir my-infra && cd my-infra
|
||
|
||
# 2. Создаём main.tf (скопировать из примера выше)
|
||
# 3. Создаём terraform.tfvars с токеном
|
||
|
||
# 4. Инициализация
|
||
terraform init
|
||
|
||
# 5. Проверка плана
|
||
terraform plan
|
||
|
||
# 6. Применение
|
||
terraform apply
|
||
|
||
# 7. При необходимости — удаление
|
||
terraform destroy
|
||
```
|