Как управлять «Облачными базами данных» через Terraform-провайдера Selectel - Академия Selectel

Как управлять «Облачными базами данных» через Terraform-провайдера Selectel

Алексей Степаненко
Алексей Степаненко Системный администратор
17 июня 2021

Ранее в блоге мы рассмотрели Terraform-провайдер Selectel, который умеет взаимодействовать с API Selectel и который можно использовать для управления пользователями, проектами, DNS-именами, кластерами Kubernetes и другими сущностями облачного сервера. Недавно провайдер был обновлен до версии 3.6.1, в которой добавился функционал по управлению «Облачными базами данных». В статье рассказываем, как его использовать. Мы предполагаем, что читатели, […]

Изображение записи

Ранее в блоге мы рассмотрели Terraform-провайдер Selectel, который умеет взаимодействовать с API Selectel и который можно использовать для управления пользователями, проектами, DNS-именами, кластерами Kubernetes и другими сущностями облачного сервера. Недавно провайдер был обновлен до версии 3.6.1, в которой добавился функционал по управлению «Облачными базами данных». В статье рассказываем, как его использовать.

Мы предполагаем, что читатели, которых заинтересовала инструкция, уже имели дело с Terraform. Поэтому мы опускаем подробное описание установки этого программного инструмента и первые шаги по работе с ним. Но несколько ссылок все же оставим: с установкой Terraform можно ознакомиться здесь, а с введением в работу — на этой странице.

С документацией и описанием ресурсов можно ознакомиться на странице Terraform-провайдера.

Итак, что можно сделать с «Облачными базами данных» через Terraform-провайдера: 

  • Создавать кластеры базы данных;
  • Создавать базы и пользователей, управлять доступом;
  • Управлять расширениями PostgreSQL.

Далее мы реализуем первый пункт на практике.

Примеры из репозитория

В каталоге examples/dbaas/ доступно три примера:

  1. get_params;
  2. mysql_cluster;
  3. postgres_cluster.
Примеры из репозитория

get_params — информационный проект для получения списка текущих flavor (конфигураций облачных серверов в терминологии OpenStack) и типов баз данных c UUID через data-ресурсы. Это может быть полезно при работе с API через CLI-инструменты.

mysql_cluster — создание однонодного кластера MySQL из фиксированной конфигурации в уже существующей приватной сети с именем nat, для поиска ресурсов network/subnet используется OpenStack-провайдер.

postgres_cluster — создание кластера PostgreSQL гибкой конфигурации c тремя нодами. Как и в предыдущем примере, кластер создается в существующей приватной сети с именем nat.

Важно: для авторизации при работе с провайдером в настоящее время используется токен аккаунта из панели управления Selectel. Получить его можно на странице Профиль и настройкиКлючи API. Работа с ключом накладывает ограничение: доступ осуществляется во все проекты «Облачной платформы» и ко всем ресурсам аккаунта. В будущем будет возможность авторизоваться в проекте с правами пользователя конкретного проекта.

Практика

Давайте рассмотрим, как создать кластер PostgreSQL, с допущением, что вы уже создали сеть, к которой будет подключаться кластер базы данных. В этом случае нам понадобится два Terraform-провайдера – Selectel и OpenStack – с авторизацией в каждом из них. Первая авторизация – с токеном аккаунта, вторая – с логином/паролем конкретного проекта (ниже мы рассмотрим авторизацию более подробно). 

Selectel-провайдер позволяет создавать проекты, пользователей, управлять квотами, а также кластерами Kubernetes и «Облачных баз данных». OpenStack-провайдер, в свою очередь, берет на себя задачу по управлению сетями, виртуальными машинами и дисковыми устройствами.

Склонируем репозиторий с примерами командой: 

git clone https://github.com/selectel/terraform-examples

Перейдем в каталог terraform-examples/examples/dbaas/postgres_cluster:

cd terraform-examples/examples/dbaas/postgres_cluster

Рассмотрим структуру проекта:

  • main.tf — файл с описанными провайдерами, работа с сетью и основными ресурсами базы данных.
  • output.tf — файл с переменными для отображения/вывода.
  • vars.tf — файл с входными переменными и их значениями по умолчанию. 
  • vars.tfvars.example — файл-шаблон для создания vars.tfvars, значения переменных из него будут переписывать значения из vars.tf.
  • README.md — короткая инструкция по запуску примера.

Скопируем файл с input-переменными:

cp vars.tfvars.example vars.tfvars

Далее нужно отредактировать vars.tfvars. Мы используем Vim, но можно использовать любой другой редактор.

vim vars.tfvars

Заполним параметры подключения. Как мы уже писали выше, нам понадобится доступ к аккаунту в панели управления Selectel и доступ к проекту OpenStack.

— ID в my.selectel.ru/номер договора

sel_account="SEL_ACCOUNT"

Токен

sel_token="SEL_TOKEN"

— ID проекта «Облачной платформы»

project_id="PROJECT_ID"

— Регион проекта «Облачной платформы»

region="REGION"

— Пользователь OpenStack, привязанный к проекту

user_name="USERNAME"

— Пароль пользователя OpenStack

user_password="USER_PASSWORD"

Как получить API-ключ аккаунта, подробно описано здесь. Если ключа нет, нужно его создать. Подробнее о том, как это сделать, — в инструкции.

Больше информации про управление проектами и пользователями можно найти по ссылке. Будем исходить из того, что у вас уже есть проект в «Облачной платформе Selectel» и пользователь с доступом в этот проект. Если нет, нужно добавить.

PROJECT_ID, или ID проекта, можно получить, развернув список проектов и нажав на кнопку «Скопировать».

Перейдя на вкладку «Облачная платформа», пользователь может получить USERNAME, проверить «привязку» к проекту и при необходимости сбросить пароль.

Это необходимо, так как мы работаем с двумя провайдерами (файл main.tf).

Конфигурация Selectel-провайдера

provider "selectel" {
  token = var.sel_token
}

Конфигурация OpenStack-провайдера

provider "openstack" {
  user_name                  = var.user_name
  password                     = var.user_password
  tenant_id                      = var.project_id
  project_domain_name = var.sel_account
  user_domain_name    = var.sel_account
  auth_url                       = var.os_auth_url
  region                          = var.region
}

Через OpenStack-провайдера мы будем получать данные о network/subnet.

data "openstack_networking_subnet_v2" "my_subnet" {
  network_id = data.openstack_networking_network_v2.my_net.id
}

Полученные данные будем использовать в Selectel-провайдере.

resource "selectel_dbaas_datastore_v1" "datastore_1" {
  ...
  subnet_id  = data.openstack_networking_subnet_v2.my_subnet.id
}

В нашем случае кластер создается в сети с именем nat. Если вы используете другую сеть, имя можно посмотреть на вкладке Облачная платформаСеть и добавить в vars.tfvars параметр network_name=”ИМЯ_СЕТИ”.

После редактирования файла vars.tfvars можно создать кластер.

— Инициализация terraform-окружения

terraform init

— Просмотр предложенных операций

terraform plan --var-file="vars.tfvars"

— Применение манифеста. После просмотра планируемых действий нужно набрать yes для подтверждения

terraform apply --var-file="vars.tfvars"

Вывод команды:

$ terraform apply --var-file="vars.tfvars"


An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:
….
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

selectel_dbaas_datastore_v1.datastore_1: Creating...
selectel_dbaas_datastore_v1.datastore_1: Still creating... [10s elapsed]
…
selectel_dbaas_datastore_v1.datastore_1: Still creating... [3m30s elapsed]
selectel_dbaas_datastore_v1.datastore_1: Creation complete after 3m31s [id=09e8dde6-99e2-4410-8792-c2961e467a5b]
selectel_dbaas_user_v1.user_1: Creating...
selectel_dbaas_user_v1.user_1: Still creating... [10s elapsed]
selectel_dbaas_user_v1.user_1: Creation complete after 13s [id=b3a82aa2-41ec-44e9-96ee-2721acb6245f]
selectel_dbaas_database_v1.database_1: Creating...
selectel_dbaas_database_v1.database_1: Still creating... [10s elapsed]
selectel_dbaas_database_v1.database_1: Creation complete after 13s [id=5f824ad3-77a6-4f25-a824-d352c5fcf642]
selectel_dbaas_extension_v1.extension_1: Creating...
selectel_dbaas_extension_v1.extension_1: Still creating... [10s elapsed]
selectel_dbaas_extension_v1.extension_1: Creation complete after 14s [id=4b27be28-ebf5-46b9-85fc-6d945b1bfdd6]

Apply complete! Resources: 4 added, 0 changed, 0 destroyed.

Outputs:

cluster_id = "09e8dde6-99e2-4410-8792-c2961e467a5b"
cluster_status = "ACTIVE"
db_name = "db"
db_user = "user"
db_user_password = "secret"
master_host = "master.09e8dde6-99e2-4410-8792-c2961e467a5b.c.dbaas.selcloud.ru"

В данном примере есть output-переменные, помогающие упростить подключение к кластеру со стороны третьих инструментов. К примеру, данные переменные можно использовать в скрипте настройки приложения для подключения к базе данных или передать в систему управления конфигурациями (например, Ansible) для последующей настройки окружения. Подробнее можно посмотреть в файле output.tf.

$ terraform output
cluster_id = "09e8dde6-99e2-4410-8792-c2961e467a5b"
cluster_status = "ACTIVE"
db_name = "db"
db_user = "user"
db_user_password = "secret"
master_host = "master.09e8dde6-99e2-4410-8792-c2961e467a5b.c.dbaas.selcloud.ru"

$ terraform output master_host
"master.09e8dde6-99e2-4410-8792-c2961e467a5b.c.dbaas.selcloud.ru"

Проверяем создание кластера в панели управления. Видим, что кластер успешно создан.

Удалить стенд в Terraform можно с помощью следующей команды:

terraform destroy --var-file="vars.tfvars"

Ресурсы провайдера

Актуальная информация по DBaaS-ресурсам и объектам в Terraform-провайдере Selectel представлена на этой странице.

Рассмотрим представленные ресурсы более подробно.

selectel_dbaas_datastore_v1 — основной ресурс, отвечающий за создание кластера. Дополнительно можно задать необходимый flavor и настройки firewall. При работе с PostgreSQL можно задать настройки пуллера.

selectel_dbaas_user_v1 — создание пользователя базы данных.

selectel_dbaas_database_v1 — создание базы данных. При работе с PostgreSQL нужно указать id пользователя в поле owner_id (см. пример с созданием кластера PostgreSQL), также можно задать локаль.

selectel_dbaas_grant_v1 — управление доступом пользователей к базам данных.

selectel_dbaas_extension_v1 — управления расширениями PostgreSQL.

Data-source объекты подробно представлены в примере get_params.

selectel_dbaas_available_extension_v1 — список доступных расширений.

selectel_dbaas_datastore_type_v1 — список доступных типов баз данных с версиями.

selectel_dbaas_flavor_v1 — список доступных конфигураций (CPU/RAM/HDD).

Заключение

«Облачные базы данных» — это полностью управляемые СУБД, настройка, обслуживание и отказоустойчивость которых обеспечивается на стороне Selectel. Работают на базе вычислительных ресурсов «Облачной платформы Selectel». 

Благодаря Terraform можно встроить работу с кластером базы данных в свой IaC Workflow: описывать конфигурацию кодом, вести версионирование, проводить ревью, планировать изменения и так далее.

Управление базой данных через Terraform можно встроить в процессы тестирования приложения. К примеру, через CI/CD-инструменты: создать базу, наполнить данными, протестировать приложение и следом удалить окружение. Также с помощью этого инструмента удобно использовать базы данных в связке с Kubernetes. Можно в одном месте декларативно описать инфраструктурную конфигурацию в облаке.