У провайдера Selectel появилась уникальная возможность по автоматизированному управлению инфраструктурой на базе выделенных серверов, а не виртуальных, как это обычно принято у современных облачных провайдеров. Для этого используется собственный Terraform-провайдер. Ниже расскажу об этом подробнее.
Введение
В современном мире принято практически как стандарт описание инфраструктуры в виде кода. Такой подход носит название IaC (Infrastructure as Code). Для этого могут использоваться разные инструменты, но наиболее популярным и функциональным является Terraform или его форк OpenTofu.
Данный подход отлично ложится на виртуальную инфраструктуру, в частности, облачную. Благодаря тому, что это программное управление выделенными ресурсами, его легко автоматизировать. Эта одна из основных причин, почему облачные технологии в последнии годы завоевали такую популярность. Вы легко можете управлять выделенными и, соответственно, оплаченными ресурсами. Причём делать это можно автоматически в зависимости от требуемой производительности и реальной нагрузки на инфраструктуру. Второй плюс такого подхода - вы легко можете восстановить или скопировать инфраструктуру, потому что она вся у вас описана в текстовых манифестах.
Для облачных ресурсов управление стандартизировано и доступно, а вот с железом история посложнее. Чаще всего каждый провайдер сам решает эту задачу своими силами, чтобы предоставить клиентам управление железными серверами. И далеко не у всех в принципе есть какие-то возможности автоматизации. Обычным делом является ручной заказ нового сервера из списка доступных, либо через заявку в техническую поддержку.
Selectel сделал огромный шаг навстречу автоматизации и реализовал Terraform-провайдера для управления железными серверами. Это прямой путь к концепции Bare Metal Cloud, когда вы с железными серверами работаете так же, как с виртуальными, только на выходе получаете бо́льшую производительность за меньшие деньги. Те, кто регулярно арендуют серверные мощности знают, что виртуальные ресурсы заметно дороже аренды аналогичных напрямую на железе.
Что такое Terraform
Кратко поясню, что такое Terraform для тех, кто никогда с ним не работал. Это бесплатное open source программное обеспечение для управления вычислительными ресурсами по модели «инфраструктура как код» (Infrastructure as Code, IaC).
Вы один раз описываете в конфигурационном файле, что хотите получить. То есть буквально указываете количество виртуальных машин или серверов, процессоров, оперативной памяти, сетевых карт и настроек для них и т.д. Ваш провайдер, если он поддерживает описание архитектуры через Terraform манифесты, выполняет все запросы из вашей конфигурации, а вы автоматически получаете уже преднастроенную инфраструктуру, куда дальше можете устанавливать программные продукты. Сделать это можно также через Terraform или другие инструменты автоматизации (Ansible, Chef и т.д.).
Terraform в Selectel для выделенных серверов
Переходим конкретно к Terraform-провайдеру Selectel, и рассмотрим, что с его помощью можно сделать как в контексте задачи по управлению железными серверами, так и другими ресурсами провайдера.
У провайдера Selectel доступные к аренде стандартизированные конфигурации серверов имеют свои уникальные названия, например AR45-NVMe, CL20-SSD и т.д. Подобрав и запомнив подходящие конфигурации, вы можете использовать их названия в описании желаемой инфраструктуры для автоматизированного заказа.
Перечислю основные характеристики железного сервера, которые вы можете указать при заказе через Terraform:
- Название конфигурации
- Локация датацентра
- Название проекта, для которого будет заказан сервер
- Образ ОС, который будет автоматически установлен на сервер
- Оплаченный период: день, месяц, 3, 6, 12 месяцев
- Название сервера
- Подсеть и IP адрес
- SSH ключ и пароль root
- Конфигурация софтового рейда, разделы диска и файловая система
На выходе вы получите преднастроенную операционную систему с доступом к ней по SSH, где всё готово для дальнейшей ручной или автоматической настройки. Процесс заказа практически ничем не отличается от типовых облачных виртуальных машин, за исключением того, что тут вы указываете название конфигурации железного сервера, а не ресурсы в виде CPU или RAM.
Помимо заказа железного сервера, вы можете управлять и другими объектами. Причём это касается не только непосредственно аренды тех или иных ресурсов или услуг, но и настроек, в том числе бесплатных (DNS записи и др.). Например, с помощью Terraform можно создавать новые проекты и пользователей в них. А потом уже в этих проектах разворачивать инфраструктуру, состоящую из разных компонентов, описанных в рамках одного манифеста. Например, железный сервер, подсеть для него, публичный IP адрес и DNS записи.
В качестве хранилища для Terraform State можно использовать услугу S3 от Selectel. Terraform State (состояние Terraform) - это файл с расширением .tfstate, в котором хранится актуальная информация о состоянии инфраструктуры и используемых конфигурациях. Сохраняя его в S3, можно удобно управлять доступом и резервными копиями.
Terraform-провайдер Selectel
От теории переходим к практике. Посмотрим, как работать с инфраструктурой Selectel с использованием Terraform. Для начала установим его на свою машину. Я для примера буду работать на своём дистрибутиве Ubuntu 24, установленном в окружении WSL2.
Установить Terraform можно разными способами. К сожалению, из-за санкций и блокировок со стороны западных вендоров, установить продукт из официальных репозиториев не получится. Можно выбрать любое другое зеркало. Например, от Яндекса или Selectel. Достаточно просто скачать и установить бинарник. На момент написания статьи актуальная версия Terraform - 1.13.5. Качаем и ставим.
# wget https://mirror.yandex.ru/mirrors/releases.hashicorp.com/terraform/1.13.5/terraform_1.13.5_linux_amd64.zip # unzip terraform_1.13.5_linux_amd64.zip # mv terraform /usr/local/bin/
Проверяем, что всё в порядке:
# terraform -v Terraform v1.13.5 on linux_amd64
Далее идём в инструкцию от Selectel и настраиваем взаимодействие с инфраструктурой провайдера. Для этого нам понадобится:
- Создать сервисного пользователя, от имени которого будем выполнять задачи.
- Настроить Terraform-провайдер Selectel.
- Инициализировать конфигурацию и проверить подключение.
Идём в панель управления и создаём сервисного пользователя. Делается это в разделе Аккаунт ⇨ Сервисные пользователи. У учётной записи должны быть 2 роли:
- member - для инициализации провайдера Selectel и создания ресурсов
- iam_admin - для создания дополнительных пользователей и разграничения доступа в проектах
Создаём директорию для конфигурации и сразу конфигурационный файл:
# mkdir ~/selectel # touch provider.tf
В provider.tf нужно будет добавить актуальную версию самого провайдера. Посмотреть её можно в репозитории. На момент написания статьи это версия 7.1.0. Заполняем файл:
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "~> 7.1.0"
}
}
}
Напомню, что я действую по инструкции из документации.
Теперь нужно указать, чтобы Terraform использовал зеркало Selectel, так как к ресурсам Hashicorp у нас доступ закрыт. Для этого создайте файл ~/.terraformrc и добавьте туда:
provider_installation {
network_mirror {
url = "https://tf-proxy.selectel.ru/mirror/v1/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}
Возвращаемся в директорию ~/selectel, где описан провайдер, и инициализируем конфигурацию:
# cd ~/selectel # terraform init
Провайдер установлен. Добавляем в provider.tf конфигурацию самого провайдера:
provider "selectel" {
domain_name = "12345"
username = "user"
password = "password123"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}
- domain_name - номер аккаунта. Можно посмотреть в панели управления в правом верхнем углу;
- username - имя сервисного пользователя
- password - пароль сервисного пользователя
- auth_region - пул для авторизации. Список доступных пулов можно посмотреть в документации.
Проверяем, что получилось:
# terraform init # terraform plan
Всё в порядке. Предварительные настройки, необходимые для подключения к инфраструктуре Selectel, выполнили. Теперь можно переходить непосредственно к созданию и настройке серверов.
Создание и настройка сервера с помощью Terraform
Выполним заказ железного сервера с помощью Terraform. Для этого нам нужно указать следующий минимальный набор параметров:
- Проект, к которому будет привязан сервер
- Название готовой конфигурации сервера
- Географическую локацию выделенного сервера
- Версию ОС, которая будет автоматически установлена
Тарифный план
Скажу честно, у меня не сразу получилось подобрать все параметры. Написание статьи выпало на активное обновление провайдера. Я столкнулся с небольшой путаницей в описании ресурсов. Но в итоге всё получилось. Напишу сразу готовый рабочий вариант, который точно работает, так как проверен мной лично.
Я закажу сервер со следующими параметрами:
- Проект terraform-demo и отдельный сервисный пользователь для него demo-user
- Конфигурация: EL09-SSD
- Регион: MSK-1
- Система: Ubuntu 24.04
- Тарифный план: 1 day
Добавляем в конфигурацию provider.tf или создаём отдельный файл .tf с описанием ресурсов и записываем туда:
resource "selectel_vpc_project_v2" "project_1" {
name = "terraform-demo"
}
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "demo-user"
password = "TopSecretPass123&%#"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}
data "selectel_dedicated_configuration_v1" "server_config" {
project_id = selectel_vpc_project_v2.project_1.id
deep_filter = <<EOT
{
"name": "EL09-SSD"
}
EOT
}
data "selectel_dedicated_location_v1" "server_location" {
project_id = selectel_vpc_project_v2.project_1.id
filter {
name = "MSK-1"
}
}
data "selectel_dedicated_os_v1" "server_os" {
project_id = selectel_vpc_project_v2.project_1.id
filter {
name = "Ubuntu"
version_value = "2404"
configuration_id = data.selectel_dedicated_configuration_v1.server_config.configurations[0].id
location_id = data.selectel_dedicated_location_v1.server_location.locations[0].id
}
}
resource "selectel_dedicated_server_v1" "server_1" {
project_id = selectel_vpc_project_v2.project_1.id
configuration_id = data.selectel_dedicated_configuration_v1.server_config.configurations[0].id
location_id = data.selectel_dedicated_location_v1.server_location.locations[0].id
os_id = data.selectel_dedicated_os_v1.server_os.os[0].id
price_plan_name = "1 day"
}
Для стопроцентной уверенности в выборе сервера и тарифного плана, можно сначала создать только проект, потом зайти в него через панель управления и посмотреть доступные конфигурации. Я поступил изначально так. Вот список конфигураций:
А после этого уже задавать параметры сервера. Ту же самую информацию можно посмотреть в консоли через Terraform и его output. Но там не так наглядно, поэтому я смотрел через панель управления.
Итак, конфигурацию сервера приготовили. Проверяем её:
# terraform plan
Всё нормально, ошибок нет. В результате выполнения получим на выходе новый сервер. Делаем это:
# terraform apply
Мне пришлось подождать 9 минут, пока добавлялся и настраивался сервер.
Иду в панель управления и проверяю.
Подключаюсь к серверу по SSH:
Смотрю на разбивку дисков:

По умолчанию из двух дисков собран mdadm массив RAID1, с разделом /boot и корнем / на всём остальном объёме. Это типовая настройка по умолчанию для серверов. Управлять разбивкой можно через Terraform. Выглядит это примерно так:
partitions_config {
soft_raid_config {
name = "first-raid"
level = "raid1"
disk_type = "SSD NVMe M.2"
}
disk_partitions {
mount = "/boot"
size = 1
raid = "first-raid"
}
disk_partitions {
mount = "swap"
size_percent = 4
raid = "first-raid"
}
disk_partitions {
mount = "/"
size = -1
raid = "first-raid"
fs_type = "ext4"
}
Описание параметров есть в документации.
Для того, чтобы удалить сервер вместе с проектом, достаточно закомментировать в конфигурации строки с их добавлением и принять изменения.
На картинке выше скрины с удалением только сервера, без проекта. Забыл про него. Сервер не удаляется, а снимается с оплаты. Соответственно, он будет удалён после того, как закончится оплаченный период. Чтобы гарантированно и сразу удалить сервер, надо удалить проект с ним. Потом уже зашёл и удалил дополнительно проект. Проверяю панель управления - там пусто. Нет ни проекта, ни сервера.
Попробуем теперь создать сервер с более насыщенной конфигурацией. К указанным выше параметрам добавим следующие:
- Конкретный IP адрес из арендованной публичной сети
- Добавим свой SSH ключ для подключения
- Укажем имя сервера как в панели управления, так и в самой ОС
- Установим пароль для пользователя root
- Установим Docker и запустим контейнер
На выходе у нас условно будет полностью настроенный сервер с рабочей нагрузкой. Для того, чтобы заказать публичную сеть, у нас уже должен быть создан проект. Так что сначала создаём отдельный проект, вручную или через Terraform, как я это показал выше. Далее заходим в этот проект, выбираем в панели управления Продукты ⇨ Выделенные серверы ⇨ Сеть ⇨ Заказать публичную подсеть.
Сеть по какой-то причине заказывается в ручном режиме. Нужно явно указать, для чего она будет использоваться и подождать, когда техподдержка её вам подключит и пришлёт подробную инструкцию по использованию. У меня ночью это заняло минут 15-20.
Обращаю внимание, что подсеть должна быть заказана там же, где вы будете заказывать сервер. У меня это локация MSK-1.
Теперь добавим свой SSH ключ. Для этого тут же в разделе с серверами есть соответствующий раздел меню SSH-ключи.
Далее подготовим скрипт, в котором опишем действия, которые нужно выполнить после установки ОС. Создаю для него отдельную директорию ~/selectel/init-script-dir и кладу туда файл init.sh следующего содержания:
#!/bin/bash apt install curl -y curl https://get.docker.com | bash - docker run --name angie -p 8080:80 -d docker.angie.software/angie:latest
Устанавливаю curl, с его помощью загружаю и запускаю скрипт автоматической установки Docker и потом запускаю контейнер с веб сервером Angie.
Все подготовительные действия сделали. Привожу итоговый Terraform файл для заказа сервера с указанными параметрами.
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "~> 7.1.0"
}
}
}
provider "selectel" {
domain_name = "12345"
username = "terraform"
password = "password123"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}
# Создаём проект
resource "selectel_vpc_project_v2" "project_1" {
name = "terraform-demo"
}
# Создаём пользователя
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "demo-user"
password = "password321"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}
# Выбор конфигурации
data "selectel_dedicated_configuration_v1" "server_config" {
project_id = selectel_vpc_project_v2.project_1.id
deep_filter = <<EOT
{
"name": "EL09-SSD"
}
EOT
}
# Выбор локации
data "selectel_dedicated_location_v1" "server_location" {
project_id = selectel_vpc_project_v2.project_1.id
filter {
name = "MSK-1"
}
}
# Выбор ОС
data "selectel_dedicated_os_v1" "server_os" {
project_id = selectel_vpc_project_v2.project_1.id
filter {
name = "Ubuntu"
version_value = "2404"
configuration_id = data.selectel_dedicated_configuration_v1.server_config.configurations[0].id
location_id = data.selectel_dedicated_location_v1.server_location.locations[0].id
}
}
# Выбор IP адреса
data "selectel_dedicated_public_subnet_v1" "public_subnets" {
project_id = selectel_vpc_project_v2.project_1.id
filter {
location_id = data.selectel_dedicated_location_v1.server_location.locations[0].id
subnet = "176.114.95.64/28"
ip = "176.114.95.65"
}
}
# Создание сервера
resource "selectel_dedicated_server_v1" "server_1" {
project_id = selectel_vpc_project_v2.project_1.id
configuration_id = data.selectel_dedicated_configuration_v1.server_config.configurations[0].id
location_id = data.selectel_dedicated_location_v1.server_location.locations[0].id
os_id = data.selectel_dedicated_os_v1.server_os.os[0].id
public_subnet_id = data.selectel_dedicated_public_subnet_v1.public_subnets.subnets[0].id
ssh_key_name = "serveradmin"
os_password = "Ajhu#5qvq"
os_host_name = "terraform-srv"
user_data = file("init-script-dir/init.sh")
price_plan_name = "1 day"
}
Проверяем и запускаем:
# terraform validate # terraform plan # terraform apply
Жду примерно 10 минут и иду проверять в панель управления. Сервер с заданными настройками создан:
На картинке указан не тот IP, что в конфигурации выше, потому что я не дождался выделения публичной подсети и создал сервер с произвольным IP. Потом уже проверил с выделенной. Так что приведённая выше конфигурация рабочая.
Подключаюсь к серверу и проверяю настройки:
Имя сервера указано, мой ключ добавлен, пароль root тоже, Docker установлен и контейнер запущен.
Объёмный получился материал. Не буду его увеличивать дополнительными примерами. Думаю, принцип понятен. Я во всём разобрался сам, просто читая документацию и пробуя.
Отдельно отмечу, что вы можете настроить хранение Terraform State в S3 хранилище того же Selectel. Это будет удобно для совместной работы с манифестами и бэкапа состояния. Настройка простая, полностью описана в документации. Вам нужно будет создать S3 бакет и пользователя с доступом к нему. Далее по готовому примеру прописать хранение .tfstate в созданном бакете в конфигурации Terraform в разделе backend, как показано в документации.
Заключение
Я показал, как с помощью Terraform можно управлять заказом и настройками выделенных серверов в Selectel. Причём делать это несложно даже для тех, кто никогда не работал с Terraform. Для базового использования освоить его нетрудно. Насколько мне известно, подобной услуги нет ни у одного провайдера. Я имею ввиду именно заказ железных серверов.
С помощью Terraform-провайдера вы можете вести всю свою железную инфраструктуру в формате IaC, масштабировать, переносить, копировать и т.д. То есть действовать точно так же, как это привыкли делать с облачными ресурсами, только тут у вас будут железные сервера, которые в пересчёте на ресурсы дешевле в 2-3 раза облаков. А если брать бюджетные конфигурации на десктопном железе для тех же тестовых или временных окружений, то экономия будет ещё больше.
Selectel, конечно, впечатляет своими инновациями. Говорю это откровенно, потому что знаю этого провайдера лет 10. И помню, что у него было из услуг в то время. А сейчас он так оброс функциональностью, что я уже теряюсь в панели управления. Чего там только нет. Причём речь не только об услугах, но и настройках. Даже заказ доменов появился. Переношу туда свои домены.
Реклама, АО «Селектел» ИНН 7810962785, erid: 2SDnjcHafjd
Server Admin Авторский блог системного администратора



















