Настройка Terraform для заказа выделенных серверов в Selectel

У провайдера 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

Установка Terraform

Далее идём в инструкцию от Selectel и настраиваем взаимодействие с инфраструктурой провайдера. Для этого нам понадобится:

  1. Создать сервисного пользователя, от имени которого будем выполнять задачи.
  2. Настроить Terraform-провайдер Selectel.
  3. Инициализировать конфигурацию и проверить подключение.

Идём в панель управления и создаём сервисного пользователя. Делается это в разделе АккаунтСервисные пользователи. У учётной записи должны быть 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

Напомню, что я действую по инструкции из документации.

Теперь нужно указать, чтобы 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

Инициализация конфигурации Terraform

Провайдер установлен. Добавляем в 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-провайдер Selectel

Проверяем, что получилось:

# terraform init
# terraform plan

Проверка конфигурации Terraform

Всё в порядке. Предварительные настройки, необходимые для подключения к инфраструктуре 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 на заказ сервера

Всё нормально, ошибок нет. В результате выполнения получим на выходе новый сервер. Делаем это:

# terraform apply

Заказ выделенного сервера с помощью Terraform

Мне пришлось подождать 9 минут, пока добавлялся и настраивался сервер.

Время заказа сервера

Иду в панель управления и проверяю.

Проверка сервера в панели управления

Подключаюсь к серверу по SSH:

Подключение к заказанному серверу по 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"
    }

Описание параметров есть в документации.

Для того, чтобы удалить сервер вместе с проектом, достаточно закомментировать в конфигурации строки с их добавлением и принять изменения.

Удаление сервера через Terraform

Удаление сервера через Terraform

На картинке выше скрины с удалением только сервера, без проекта. Забыл про него. Сервер не удаляется, а снимается с оплаты. Соответственно, он будет удалён после того, как закончится оплаченный период. Чтобы гарантированно и сразу удалить сервер, надо удалить проект с ним. Потом уже зашёл и удалил дополнительно проект. Проверяю панель управления - там пусто. Нет ни проекта, ни сервера.

Попробуем теперь создать сервер с более насыщенной конфигурацией. К указанным выше параметрам добавим следующие:

  • Конкретный IP адрес из арендованной публичной сети
  • Добавим свой SSH ключ для подключения
  • Укажем имя сервера как в панели управления, так и в самой ОС
  • Установим пароль для пользователя root
  • Установим Docker и запустим контейнер

На выходе у нас условно будет полностью настроенный сервер с рабочей нагрузкой. Для того, чтобы заказать публичную сеть, у нас уже должен быть создан проект. Так что сначала создаём отдельный проект, вручную или через Terraform, как я это показал выше. Далее заходим в этот проект, выбираем в панели управления ПродуктыВыделенные серверыСетьЗаказать публичную подсеть.

Заказ публичной подсети в Selectel

Сеть по какой-то причине заказывается в ручном режиме. Нужно явно указать, для чего она будет использоваться и подождать, когда техподдержка её вам подключит и пришлёт подробную инструкцию по использованию. У меня ночью это заняло минут 15-20.

Обращаю внимание, что подсеть должна быть заказана там же, где вы будете заказывать сервер. У меня это локация MSK-1.

Теперь добавим свой SSH ключ. Для этого тут же в разделе с серверами есть соответствующий раздел меню 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

Заказ и настройка железного сервера с помощью Terraform

Жду примерно 10 минут и иду проверять в панель управления. Сервер с заданными настройками создан:

Проверка заказанного выделенного сервера

На картинке указан не тот IP, что в конфигурации выше, потому что я не дождался выделения публичной подсети и создал сервер с произвольным IP. Потом уже проверил с выделенной. Так что приведённая выше конфигурация рабочая.

Подключаюсь к серверу и проверяю настройки:

Подключение к преднастроенному с помощью Terraform выделенному серверу

Имя сервера указано, мой ключ добавлен, пароль root тоже, Docker установлен и контейнер запущен.

Объёмный получился материал. Не буду его увеличивать дополнительными примерами. Думаю, принцип понятен. Я во всём разобрался сам, просто читая документацию и пробуя.

Отдельно отмечу, что вы можете настроить хранение Terraform State в S3 хранилище того же Selectel. Это будет удобно для совместной работы с манифестами и бэкапа состояния. Настройка простая, полностью описана в документации. Вам нужно будет создать S3 бакет и пользователя с доступом к нему. Далее по готовому примеру прописать хранение .tfstate в созданном бакете в конфигурации Terraform в разделе backend, как показано в документации.

Заключение

Я показал, как с помощью Terraform можно управлять заказом и настройками выделенных серверов в Selectel. Причём делать это несложно даже для тех, кто никогда не работал с Terraform. Для базового использования освоить его нетрудно. Насколько мне известно, подобной услуги нет ни у одного провайдера. Я имею ввиду именно заказ железных серверов.

С помощью Terraform-провайдера вы можете вести всю свою железную инфраструктуру в формате IaC, масштабировать, переносить, копировать и т.д. То есть действовать точно так же, как это привыкли делать с облачными ресурсами, только тут у вас будут железные сервера, которые в пересчёте на ресурсы дешевле в 2-3 раза облаков. А если брать бюджетные конфигурации на десктопном железе для тех же тестовых или временных окружений, то экономия будет ещё больше.

Selectel, конечно, впечатляет своими инновациями. Говорю это откровенно, потому что знаю этого провайдера лет 10. И помню, что у него было из услуг в то время. А сейчас он так оброс функциональностью, что я уже теряюсь в панели управления. Чего там только нет. Причём речь не только об услугах, но и настройках. Даже заказ доменов появился. Переношу туда свои домены.

Реклама, АО «Селектел» ИНН 7810962785, erid: 2SDnjcHafjd

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar