Terraform-провайдер Selectel

Мы запустили официальный Terraform-провайдер для работы с Selectel. Этот продукт позволяет пользователям полностью реализовать управление ресурсами через методологию Infrastructure-as-code (инфраструктура как код). В настоящее время провайдер поддерживает управление ресурсами услуги «Виртуальное приватное облако» (далее VPC). В будущем мы планируем добавить в него управление ресурсами других услуг, предоставляемых Selectel.

Как вы уже знаете, услуга VPC построена на базе OpenStack. Однако, в силу того, что OpenStack не предоставляет нативных средств для обслуживания публичного облака, мы реализовали недостающую функциональность в наборе дополнительных API, которые упрощают управление сложными составными объектами и делают работу более удобной. Часть функциональности, доступной в OpenStack, закрыта от использования напрямую, но доступна через наш API.

В Terraform-провайдере Selectel сейчас реализована возможность управления следующими ресурсами VPC:

  • проекты и их квоты;
  • пользователи, их роли и токены;
  • публичные подсети, в том числе кросс-региональные и VRRP;
  • лицензии ПО.

Провайдер использует нашу публичную Go-библиотеку для работы с API VPC.

И библиотека и сам провайдер являются open-source, их разработка ведется на Github:

Для управления остальными ресурсами облака, такими как виртуальные машины, диски, кластеры Kubernetes, вы можете использовать Terraform-провайдер OpenStack. Официальная документация для обоих провайдеров доступна по следующим ссылкам:

Начало работы

Для начала работы необходимо установить Terraform (инструкции и ссылки на установочные пакеты можно посмотреть на официальном сайте).

Для работы провайдеру требуется ключ Selectel API, который создается в панели управления для аккаунта.

Манифесты для работы с Selectel создаются посредством Terraform либо используя набор готовых примеров, которые доступны в нашем Github-репозитории: terraform-examples.

Репозиторий с примерами разбит на две директории:

  • modules, содержащая небольшие переиспользуемые модули, которые принимают на вход набор параметров и управляют небольшим набором ресурсов;
  • examples, содержащая примеры полного набора связанных между собой модулей.

После установки Terraform, создания ключа Selectel API и ознакомления с примерами, переходим к практическим примерам.

Пример создания сервера с локальным диском

Рассмотрим пример создания проекта, пользователя с ролью и виртуальной машиной с локальным диском: terraform-examples/examples/vpc/server_local_root_disk.

В файле vars.tf описаны все параметры, которые будут использованы при вызове модулей. Некоторые из них имеют значения по умолчанию, например, сервер будет создан в зоне ru-3a со следующей конфигурацией:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

В файле main.tf происходит инициализация провайдера Selectel:

provider "selectel" {
token    = "${var.sel_token}"
}

Также в этом файле указано значение по умолчанию для SSH-ключа, который будет установлен на сервер:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

При необходимости можно указать другой публичный ключ. Ключ не обязательно указывать в виде пути к файлу, также можно добавить значение в виде строки.

Далее в этом файле запускаются модули project_with_user и server_local_root_disk, которые управляют необходимыми ресурсами.

Разберем подробнее эти модули.

Создание проекта и пользователя с ролью

Первый модуль создает проект и пользователя с ролью в этом проекте: terraform-examples/modules/vpc/project_with_user.

Созданный пользователь сможет авторизоваться в OpenStack и управлять его ресурсами. Модуль простой и управляет всего тремя сущностями:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Создание виртуального сервера с локальным диском

Второй модуль занимается управлением объектами OpenStack, которые необходимы для создания сервера с локальным диском.

Следует обратить внимание на некоторые аргументы, которые указаны в этом модуле для ресурса openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
...

lifecycle {
ignore_changes = ["image_id"]
}

vendor_options {
ignore_resize_confirmation = true
}
}

Аргумент ignore_changes позволяет игнорировать изменение атрибута id для образа, используемого для создания виртуальной машины. В сервисе VPC большинство публичных образов обновляется автоматически раз в неделю и при этом их id также меняется. Это обусловлено особенностями работы компонента OpenStack — Glance, в котором образы считаются неизменяемыми сущностями.

Если создается или изменяется существующий сервер или диск, у которого в качестве аргумента image_id используется id публичного образа, то после того как этот образ будет обновлен, повторный запуск манифеста Terraform приведет к пересозданию сервера или диска. Использование аргумента ignore_changes позволяет избежать такой ситуации.

Примечание: аргумент ignore_changes появился в Terraform достаточно давно: pull#2525.

Аргумент ignore_resize_confirmation нужен для успешного изменения размера локального диска, ядер или памяти сервера. Такие изменения производятся через компонент OpenStack Nova при помощи запроса resize. По умолчанию Nova после запроса resize переводит сервер в статус verify_resize и ждет от пользователя дополнительного подтверждения. Однако это поведение можно изменить так, чтобы Nova не дожидалась от пользователя дополнительных действий.

Указанный аргумент позволяет Terraform не дожидаться статуса verify_resize для сервера и быть готовым к тому, что сервер окажется в активном статусе после изменения его параметров. Аргумент доступен с версии 1.10.0 Terraform-провайдера OpenStack: pull#422.

Создание ресурсов

Перед запуском манифестов следует учесть, что  в нашем примере запускаются два разных провайдера, причем провайдер OpenStack зависит от ресурсов провайдера Selectel, так как без создания пользователя в проекте управлять принадлежащими ему объектами невозможно. К сожалению, по этой же причине мы не можем просто запустить команду terraform apply внутри нашего примера. Нам потребуется вначале сделать apply для модуля project_with_user и уже после этого для всего остального.

Примечание: указанная проблема еще не решена в Terraform, за ее обсуждением можно следить на Github в issue#2430 и issue#4149.

Для создания ресурсов перейдем в директорию terraform-examples/examples/vpc/server_local_root_disk, ее содержимое должно быть таким:

$ ls
README.md	main.tf		vars.tf

Инициализируем модули при помощи команды:

$ terraform init

В выводе видно, что Terraform скачивает последние версии используемых провайдеров и проверяет все модули, описанные в примере.

Вначале применим модуль project_with_user. При этом требуется вручную передать значения для переменных, которые не были установлены:

  • sel_account с номером вашего аккаунта Selectel;
  • sel_token с вашим ключом для Selectel API;
  • user_password с паролем для пользователя OpenStack.

Значения для первых двух переменных надо взять из панели управления.

Для последней переменной можно придумать любой пароль.

Для применения модуля необходимо заменить значения SEL_ACCOUNT, SEL_TOKEN и USER_PASSWORD запуском команды:

$ env \
TF_VAR_sel_account=SEL_ACCOUNT \
TF_VAR_sel_token=SEL_TOKEN \
TF_VAR_user_password=USER_PASSWORD \
terraform apply -target=module.project_with_user

После запуска команды Terraform покажет, какие ресурсы он хочет создать, и потребует подтверждения:

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

Как только проект, пользователь и роль будут созданы, можно запустить создание остальных ресурсов:

$ env \
TF_VAR_sel_account=SEL_ACCOUNT \
TF_VAR_sel_token=SEL_TOKEN \
TF_VAR_user_password=USER_PASSWORD \
terraform apply

При создании ресурсов обратите внимание на вывод Terraform с внешним IP-адресом, по которому будет доступен созданный сервер:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
floating_ip: "" => "x.x.x.x"

C созданной виртуальной машиной можно работать через SSH по указанному IP.

Редактирование ресурсов

Помимо создания ресурсов через Terraform, их также можно изменять.

Для примера увеличим количество ядер и памяти для нашего сервера, изменив значения для параметров server_vcpus и server_ram_mb в файле examples/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

После этого проверяем, к каким изменениям это приведет, при помощи следующей команды:

$ env \
TF_VAR_sel_account=SEL_ACCOUNT \
TF_VAR_sel_token=SEL_TOKEN \
TF_VAR_user_password=USER_PASSWORD \
terraform plan

В результате Terraform произвел изменение ресурсов openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Обратите внимание, что это повлечет за собой перезагрузку созданной виртуальной машины.

Для применения новой конфигурации виртуальной машины используйте команду terraform apply, которую мы уже запускали ранее.

Все созданные объекты будут отображаться в панели управления VPC:

Terraform

В нашем репозитории примеров также можно ознакомиться с манифестами для создания виртуальных машин с сетевыми дисками.

Заключение

В этой статье мы ознакомились с основными способами работы с «Виртуальным приватным облаком» через Terraform. Будем рады, если вы воспользуетесь официальным Terraform-провайдером Selectel и предоставите обратную связь.

Обо всех найденных багах Terraform-провайдера Selectel можно сообщить посредством Github Issues.

Что еще почитать по теме

T-Rex 28 сентября 2022

Книги по SQL: что почитать новичкам и специалистам

Собрали 6 книг, которые помогут на старте изучения SQL и при углублении в тему.
T-Rex 28 сентября 2022
T-Rex 21 сентября 2022

Гипервизор VMware ESXi: функции и отличия от ESX

В статье рассказываем о работе с гипервизором ESXi, его отличиях от ESX и vSphere.
T-Rex 21 сентября 2022
Андрей Салита 14 сентября 2022

Отличия TCP- и UDP-протоколов — определяем разницу на примерах

Рассматриваем два самых популярных протокола транспортного уровня — протоколы TCP и UDP — и сравниваем их.
Андрей Салита 14 сентября 2022

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Владимир Туров 5 октября 2022

DBaaS: что такое облачные базы данных

Рассказываем о сервисе управляемых баз данных в облаке и объясняем, как разделяется ответственность за работу кластеров БД между провайдером и клиентом.
Владимир Туров 5 октября 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022