Создать несколько файловых хранилищ
Мы р екомендуем создавать ресурсы по порядку. Если вы создаете все ресурсы единовременно, Terraform будет учитывать зависимости между ресурсами, которые вы указали в конфигурационном файле. Если зависимости не указаны, ресурсы будут создаваться параллельно, что может приводить к ошибкам. Например, ресурс, который требуется для создания другого ресурса, может быть еще не создан.
- Опционально: настройте провайдеры.
- Создайте приватную сеть и подсеть.
- Задайте переменные для файловых хранилищ.
- Настройте конфигурацию сети хранилищ.
- Создайте файловые хранилища.
- Настройте правила доступа к файловым хранилищам.
Конфигурационные файлы
Пример файла для настройки провайдеров
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "~> 6.0"
}
openstack = {
source = "terraform-provider-openstack/openstack"
version = "2.1.0"
}
}
}
provider "selectel" {
domain_name = "123456"
username = "user"
password = "password"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}
resource "selectel_vpc_project_v2" "project_1" {
name = "project"
}
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "username"
password = "password"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}
provider "openstack" {
auth_url = "https://cloud.api.selcloud.ru/identity/v3"
domain_name = "123456"
tenant_id = selectel_vpc_project_v2.project_1.id
user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
password = selectel_iam_serviceuser_v1.serviceuser_1.password
region = "ru-9"
}
Пример файла для создания трех файловых хранилищ
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "private-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
variable "storages" {
default = [
{ name = "nfs-storage-1", size = 50, type="basic.ru-3a", proto="NFS", ip = "192.168.199.10" },
{ name = "nfs-storage-2", size = 100, type="fast.ru-3a", proto="NFS", ip = "192.168.199.11" },
{ name = "nfs-storage-3", size = 50, type="universal.ru-3a", proto="CIFS", ip = "192.168.199.12" },
]
}
resource "openstack_sharedfilesystem_sharenetwork_v2" "share_network" {
count = length(var.storages)
name = "share-network-${count.index}"
neutron_net_id = openstack_networking_network_v2.network_1.id
neutron_subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
resource "openstack_sharedfilesystem_share_v2" "share" {
count = length(var.storages)
name = var.storages[count.index].name
share_type = var.storages[count.index].type
share_proto = var.storages[count.index].proto
size = var.storages[count.index].size
share_network_id = openstack_sharedfilesystem_sharenetwork_v2.sharenetwork.id
metadata = { ip = var.storages[count.index].ip }
}
resource "openstack_sharedfilesystem_share_access_v2" "share_access" {
count = length(var.storages)
access_level = "rw"
access_to = "0.0.0.0/0"
access_type = "ip"
share_id = openstack_sharedfilesystem_share_v2.share[count.index].id
}
1. Опционально: настроить провайдеры
Если вы настроили провайдеры Selectel и OpenStack, пропустите этот шаг.
-
Убедитесь, что в панели управления вы создали сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей.
-
Создайте директорию для хранения конфигурационных файлов и отдельный файл с расширением
.tf
для настройки провайдеров. -
В файл для настройки провайдеров добавьте провайдеры Selectel и OpenStack:
terraform {
required_providers {
selectel = {
source = "selectel/selectel"
version = "~> 6.0"
}
openstack = {
source = "terraform-provider-openstack/openstack"
version = "2.1.0"
}
}
}Здесь
version
— версии провайдеров. Актуальную версию можно посмотреть в документации Selectel (в Terraform Registry и GitHub) и OpenStack (в Terraform Registry и GitHub).Подробнее о продуктах, услугах и сервисах, которыми можно управлять с помощью провайдеров, в инструкции Провайдеры Selectel и OpenStack.
-
Инициализируйте провайдер Selectel:
provider "selectel" {
domain_name = "123456"
username = "user"
password = "password"
auth_region = "ru-9"
auth_url = "https://cloud.api.selcloud.ru/identity/v3/"
}Здесь:
domain_name
— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;username
— имя сервисного пользователя с ролями Администратор аккаунта и Администратор пользователей. Можно посмотреть в панели управления: раздел Управление доступом → Управление пользователями → вкладка Сервисные пользователи (раздел доступен только Владельцу аккаунта и Администратору пользователей);password
— пароль сервисного пользователя. Можно посмотреть при создании пользователя или изменить на новый;auth_region
— пул, напримерru-9
. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
-
Создайте проект:
resource "selectel_vpc_project_v2" "project_1" {
name = "project"
}Посмотрите подробное описание ресурса selectel_vpc_project_v2.
-
Создайте сервисного пользователя для доступа к проекту и назначьте ему роль Администратор проекта:
resource "selectel_iam_serviceuser_v1" "serviceuser_1" {
name = "username"
password = "password"
role {
role_name = "member"
scope = "project"
project_id = selectel_vpc_project_v2.project_1.id
}
}Здесь:
username
— имя пользователя;password
— пароль пользователя. Пароль должен быть не короче восьми символов и содержать латинские буквы разных регистров и цифры;project_id
— ID проекта. Можно посмотреть в панели управления: в верхнем меню нажмите Продукты и выберите Облачные серверы → откройте меню проектов → в строке нужного проекта нажмите .
Посмотрите подробное описание ресурса selectel_iam_serviceuser_v1.
-
Инициализируйте провайдер OpenStack:
provider "openstack" {
auth_url = "https://cloud.api.selcloud.ru/identity/v3"
domain_name = "123456"
tenant_id = selectel_vpc_project_v2.project_1.id
user_name = selectel_iam_serviceuser_v1.serviceuser_1.name
password = selectel_iam_serviceuser_v1.serviceuser_1.password
region = "ru-9"
}Здесь:
domain_name
— номер аккаунта Selectel. Можно посмотреть в панели управления в правом верхнем углу;region
— пул, напримерru-9
. Все ресурсы будут создаваться в этом пуле. Список доступных пулов можно посмотреть в инструкции Матрицы доступности.
-
Если одновременно с настройкой провайдеров вы создаете ресурсы, то для ресурсов OpenStack добавьте аргумент
depends_on
. Например, для ресурса openstack_networking_network_v2:resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
depends_on = [
selectel_vpc_project_v2.project_1,
selectel_iam_serviceuser_v1.serviceuser_1
]
} -
Опционально: если вы хотите использовать зеркало, создайте отдельный конфигурационный файл Terraform CLI и добавьте в него блок:
provider_installation {
network_mirror {
url = "https://tf-proxy.selectel.ru/mirror/v1/"
include = ["registry.terraform.io/*/*"]
}
direct {
exclude = ["registry.terraform.io/*/*"]
}
}Подробнее о настройках зеркал в инструкции CLI Configuration File документации HashiCorp.
-
Откройте CLI.
-
Инициализируйте конфигурацию Terraform в директории:
terraform init
-
Проверьте, что конфигурационные файлы составлены без ошибок:
terraform validate
-
Отформатируйте конфигурационные файлы:
terraform fmt
-
Проверьте, какие ресурсы будут созданы:
terraform plan
-
Примените изменения и создайте ресурсы:
terraform apply
-
Подтвердите создание — введите yes и нажмите Enter. Созданные ресурсы отобразятся в панели управления.
-
Если для создания ресурсов оказалось недостаточно квот, увеличьте квоты.
2. Создать приватную сеть и подсеть
resource "openstack_networking_network_v2" "network_1" {
name = "private-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "subnet_1" {
name = "private-subnet"
network_id = openstack_networking_network_v2.network_1.id
cidr = "192.168.199.0/24"
}
Здесь cidr
— CIDR приватной подсети, например 192.168.199.0/24
.
Посмотрите подробное описание ресурсов:
3. Задать переменные для файловых хранилищ
Задайте переменную с параметрами для каждого файлового хранилища, которые вам нужно создать.
variable "storages" {
default = [
{ name = "nfs-storage-1", size = 50, type="basic.ru-3a", proto="NFS", ip = "192.168.199.10" },
{ name = "nfs-storage-2", size = 100, type="fast.ru-3a", proto="NFS", ip = "192.168.199.11" },
{ name = "nfs-storage-3", size = 50, type="universal.ru-3a", proto="CIFS", ip = "192.168.199.12" },
]
}
Здесь:
name
— название файлового хранилища;size
— размер файлового хранилища в ГБ, например50
. Ограничения — от 50 ГБ до 50 ТБ;type
— тип файлового хранилища и сегмент пула в формате<type>.<pool_segment>
, напримерbasic.ru-9a
:<type>
basic
— тип HDD Базовое;universal
— тип SSD Универсальное;fast
— тип SSD Быстрое;
<pool_segment>
— сегмент пула, в котором будет создано файловое хранилище, напримерru-9a
. Список доступных сегментов пула можно посмотреть в инструкции Матрицы доступности;
proto
— протокол файлового хранилища:NFS
— для протокола NFSv4;CIFS
— для протокола CIFS SMBv3;
- опционально:
ip
— приватный IP-адрес файлового хранилища, например192.168.199.10
. После создания хранилища IP-адрес нельзя будет изменить.
4. Настроить сети хранилищ
Для каждого файлового хранилища будет автоматически создан отдельный ресурс openstack_sharedfilesystem_sharenetwork_v2, даже если файловые хранилища используют одну приватную сеть и подсеть.
resource "openstack_sharedfilesystem_sharenetwork_v2" "share_network" {
count = length(var.storages)
name = "share-network-${count.index}"
neutron_net_id = openstack_networking_network_v2.network_1.id
neutron_subnet_id = openstack_networking_subnet_v2.subnet_1.id
}
5. Создать файловые хранилища
resource "openstack_sharedfilesystem_share_v2" "share" {
count = length(var.storages)
name = var.storages[count.index].name
share_type = var.storages[count.index].type
share_proto = var.storages[count.index].proto
size = var.storages[count.index].size
share_network_id = openstack_sharedfilesystem_sharenetwork_v2.share_network[count.index].id
metadata = { ip = var.storages[count.index].ip }
}
Здесь:
count
— количество файловых хранилищ, которые нужно создать. Значение будет основываться на количестве файловых хранилищ, которые вы задали в переменной ранее;share_type
— тип файлового хранилища и сегмент пула в формате<type>.<pool_segment>
, напримерbasic.ru-9a
. Значение для каждого файлового хранилища берется из переменной, которую вы задали ранее;share_proto
— протокол файлового хранилища. Значение для каждого файлового хранилища берется из переменной, которую вы задали ранее:NFS
— для протокола NFSv4;CIFS
— для протокола CIFS SMBv3;
size
— размер файлового хранилища в ГБ, например50
. Ограничения — от 50 ГБ до 50 ТБ. Значение для каждого файлового хранилища берется из переменной, которую вы задали ранее;- опционально:
metadata = {"ip": "<ip_address>"}
— приватный IP-адрес файлового хранилища, например192.168.199.10
. После создания хранилища IP-адрес нельзя будет изменить. Значение для каждого файлового хранилища берется из переменной, которую вы задали ранее.
Посмотрите подробное описание ресурса openstack_sharedfilesystem_share_v2.
6. Настроить правила доступа к файловым хранилищам
resource "openstack_sharedfilesystem_share_access_v2" "share_access" {
count = length(var.storages)
access_level = "rw"
access_to = "0.0.0.0/0"
access_type = "ip"
share_id = openstack_sharedfilesystem_share_v2.share[count.index].id
}
Здесь:
count
— количество файловых хранилищ. Значение будет основываться на количестве файловых хранилищ, которые вы задали в переменной ранее;access_level
— уровень доступа к хранилищу, который зависит от протокола:- для CIFS SMBv3 —
rw
(чтение и запись); - для NFSv4 —
ro
(только чтение) илиrw
(чтение и запись);
- для CIFS SMBv3 —
access_to
— IP-адрес или CIDR приватной подсети, для которых будет откры т доступ. Например:192.168.199.10
— доступ для IP-адреса;192.168.199.0/24
— доступ для диапазона приватной подсети;0.0.0.0/0
— доступ для всех адресов приватной подсети, в которой находятся файловые хранилища. Для настройки доступа к файловым хранилищам любому клиенту сети можно добавить в ресурс openstack_sharedfilesystem_share_v2 строкуmetadata = {"access_list_allow_all": "true"}
.
Посмотрите подробное описание ресурса openstack_sharedfilesystem_share_access_v2.