Этот репозиторий содержит конфигурации Terraform для автоматизированного развертывания выделенных серверов (bare metal) в облаке Selectel. Он включает в себя переиспользуемый модуль для создания серверов с поддержкой гибкой разметки дисков, управления приватными сетями и встроенными проверками.
.
├── base_modules/
│ ├── baremetal-servers/ # Основной модуль для создания выделенного сервера
│ │ ├── main.tf # Основная логика и ресурсы
│ │ ├── outputs.tf # Выводы модуля (ID, IP-адреса, VLAN)
│ │ ├── vars.tf # Входные переменные и валидации
│ │ └── versions.tf # Требуемая версия провайдера
│ └── dedicated-private-subnet/ # (Опционально) Отдельный модуль для управления подсетями
├── my-server1.tf # Пример конфигурации Terraform для сервера 1
├── my-server2.tf # Пример конфигурации Terraform для сервера2
├── provider.tf # Конфигурация провайдера Selectel
├── terraform.tfvars # Файл с переменными (не коммитить в Git!)
├── user-data/ # Директория с файлами инициализации (cloud-init/bash)
│ ├── my-script.sh
│ └── my-user-data.yml
├── variables.tf # Объявление переменных для корневого модуля
└── versions.tf # Требуемая версия Terraform и провайдеров
- Terraform >= 1.3 (для корректной работы
optionalв объектах) - Провайдер
selectel/selectel>= 8.0.0 (обязательно для поддержки новых параметров дисков и приватных сетей)
-
Клонируйте репозиторий:
git clone https://github.com/selectel/dedicated-terraform-module.git cd dedicated-terraform-module -
Настройте аутентификацию: Создайте файл
terraform.tfvarsв корне репозитория и укажите свои учетные данные:project_id = "ВАШ_PROJECT_ID" # ID проекта, в котором заказывается сервер domain_name = "ВАШ_DOMAIN_NAME" # ID аккаунта username = "ВАШЕ_ИМЯ_ПОЛЬЗОВАТЕЛЯ" # Пользователь с ролью Member в проекте password = "ВАШ_ПАРОЛЬ" auth_region = "ru-9" # Регион авторизации auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
Важно: Файл
terraform.tfvarsсодержит чувствительные данные. Убедитесь, что он добавлен в.gitignore. -
Инициализируйте Terraform:
terraform init
-
Настройте конфигурацию сервера: Изучите примеры
my-server1.tfиmy-server2.tf. Вы можете создать свой файл (например,my-new-server.tf) и вызвать модуль./base_modules/baremetal-servers.Пример конфигурации с приватной подсетью и RAID:
module "my_new_server" { source = "./base_modules/baremetal-servers" server = { project_id = var.project_id location_name = "SPB-2" configuration_name = "BL22-NVMe" os_name = "Ubuntu" os_version_name = "24.04" price_plan_name = "1 month" os_host_name = "my-new-server" ssh_key_name = "my-ssh-key" # Управление приватной сетью private_subnet_cidr = "10.10.14.0/24" private_subnet_ip = "10.10.14.105" private_vlan_id = "3028" create_private_subnet = true # Создать подсеть, если её нет # Конфигурация дисков partitions_config = { soft_raid_configs = [ { name = "first-raid" level = "raid1" disk_type = "SSD NVMe" count = 2 } ] disk_partitions = [ { mount = "/boot" size = 1 raid = "first-raid" }, { mount = "/" size = -1 # Использовать всё оставшееся пространство raid = "first-raid" } ] } } }
-
Проверьте и примените план:
terraform plan terraform apply
-
Просмотр результатов: После успешного применения модуль вернет структурированные данные о созданных серверах:
servers = { "my_new_server" = { "server_id" = "2853d7ab-4dfe-4f3c-a392-4eb1ac9a5047" "server_name" = "my-new-server" "public_ip" = "95.213.143.162" "private_ip" = "10.10.14.105" "private_vlan" = "3028" } }
| Параметр | Тип | Описание |
|---|---|---|
project_id |
string |
(Обязательно) ID проекта Selectel. |
location_name / location_id |
string |
Локация сервера (например, "SPB-2"). Можно указать имя или ID. |
configuration_name / configuration_id |
string |
Конфигурация железа (например, "BL22-NVMe"). Можно указать имя или ID. |
os_name / os_id |
string |
Операционная система. При использовании os_name рекомендуется указать os_version_name. |
price_plan_name |
string |
Тарифный план ("1 month", "3 months", "6 months", "12 months"). |
os_host_name |
string |
Hostname сервера. |
ssh_key_name / ssh_key |
string |
Имя существующего ключа или содержимое публичного ключа. |
user_data |
string |
Путь к файлу с cloud-config или bash-скриптом. |
os_password |
string |
Пароль ОС (если не указан, будет сгенерирован случайный). |
private_subnet_cidr |
string |
CIDR приватной подсети (например, "10.10.14.0/24"). |
private_subnet_ip |
string |
Конкретный IP-адрес, который нужно выдать серверу в этой подсети. |
private_vlan_id |
string |
ID VLAN для приватной подсети. |
create_private_subnet |
bool |
Если true, модуль создаст подсеть, если она не найдена. По умолчанию false. |
private_subnet_id |
string |
Явный ID существующей приватной подсети (имеет высший приоритет). |
add_private_vlan |
bool |
Добавить "сырой" приватный VLAN без привязки к подсети. По умолчанию false. |
partitions_config |
object |
Конфигурация дисков (см. пример ниже). |
force_update_additional_params |
bool |
Если true, при изменении параметров ОС (диски, ключи, user-data) будет инициирована переустановка ОС (Reinstall). По умолчанию false. |
timeouts |
object |
Таймауты операций create, update, delete (по умолчанию "60m"). |
partitions_config = {
# Опционально: конфигурация одиночных дисков без RAID
disk_configs = [
{
name = "system-disk"
disk_type = "SSD NVMe"
}
]
# Опционально: конфигурация программных RAID-массивов
soft_raid_configs = [
{
name = "data-raid"
level = "raid1" # raid0, raid1, raid10
disk_type = "HDD SATA"
count = 2 # Количество дисков в массиве
}
]
# Обязательно (если указан partitions_config): разделы дисков
disk_partitions = [
{
mount = "/"
size = -1 # Размер в GB (-1 = всё пространство)
raid = "data-raid" # Имя массива из soft_raid_configs (если используется RAID)
disk_name = "system-disk" # Имя диска из disk_configs (если RAID не используется)
fs_type = "ext4" # ext4, ext3, xfs, swap
}
]
}| Output | Описание |
|---|---|
server_id |
UUID созданного сервера в API Selectel. |
server_name |
Hostname сервера (os_host_name). |
public_ip |
Публичный IP-адрес сервера. |
private_ip |
Приватный IP-адрес сервера в указанной подсети. |
private_vlan |
ID VLAN приватной сети (берется из private_vlan_id или из созданной подсети). |
- Версия провайдера: Модуль требует
selectel/selectel >= 8.0.0. Убедитесь, что это указано в вашемversions.tf. lifecycle.ignore_changes: В модуле настроено игнорирование изменений вpartitions_config,user_data,ssh_key,ssh_key_nameиpower_state. Это сделано для предотвращения ложных срабатываний (дрейфа состояния), так как API Selectel может возвращать дополнительные атрибуты дисков после создания, а изменение этих параметров на работающем baremetal-сервере требует переустановки ОС. Будет исправленно в следующий версия провайдера.- Переустановка ОС (Reinstall): Если вам необходимо намеренно изменить разметку дисков, ключи или
user_dataна уже созданном сервере, установитеforce_update_additional_params = trueв конфигурации сервера. Это даст провайдеру команду выполнить переустановку ОС с новыми параметрами. - Приватные сети: При использовании
private_subnet_cidrмодуль сначала ищет существующую подсеть в указанной локации. Если она не найдена, аcreate_private_subnet = false, выполнение будет остановлено с понятной ошибкой валидации (precondition). - Безопасность: Никогда не коммитьте
terraform.tfvars,*.tfstateили файлы с приватными ключами в публичный репозиторий.