Как управлять «Облачными базами данных» через Terraform-провайдера Selectel
Ранее в блоге мы рассмотрели 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/ доступно три примера:
- get_params;
- mysql_cluster;
- 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. Можно в одном месте декларативно описать инфраструктурную конфигурацию в облаке.