Terraform на serverplus: инфраструктура как код
Что такое Terraform на serverplus
serverplus построен на OpenStack, поэтому его инфраструктурой можно управлять как кодом с помощью официального провайдера terraform-provider-openstack. Вы описываете серверы, сети и правила в .tf-файлах, а Terraform (или совместимый OpenTofu) приводит облако к нужному состоянию: повторяемо, с ревью в git и возможностью откатиться.
Что понадобится
- Terraform или OpenTofu установлен локально (или в CI).
- Application credentials (id + secret) из панели — раздел «Управление доступом». Это безопаснее пароля аккаунта.
- Файл
~/.config/openstack/clouds.yamlс блоком доступа (тот же, что для CLI).
clouds:
serverplus:
auth_type: v3applicationcredential
auth:
auth_url: https://identity.serverplus.uz/v3
application_credential_id: <ID>
application_credential_secret: <SECRET>
region_name: RegionOne
interface: public
identity_api_version: 3Настройка провайдера
Минимальный versions.tf и провайдер, который берёт доступ прямо из clouds.yaml:
terraform {
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 3.0"
}
}
}
provider "openstack" {
cloud = "serverplus"
}Первый сервер
Пример main.tf: SSH-ключ, security group с открытым 22 портом, виртуальная машина в приватной сети и внешний (floating) IP.
resource "openstack_compute_keypair_v2" "kp" {
name = "tf-key"
public_key = file("~/.ssh/id_rsa.pub")
}
resource "openstack_networking_secgroup_v2" "web" {
name = "tf-web"
}
resource "openstack_networking_secgroup_rule_v2" "ssh" {
direction = "ingress"
ethertype = "IPv4"
protocol = "tcp"
port_range_min = 22
port_range_max = 22
remote_ip_prefix = "0.0.0.0/0"
security_group_id = openstack_networking_secgroup_v2.web.id
}
resource "openstack_compute_instance_v2" "vm" {
name = "tf-vm-1"
image_name = "Ubuntu 22.04"
flavor_name = "m1.small"
key_pair = openstack_compute_keypair_v2.kp.name
security_groups = [openstack_networking_secgroup_v2.web.name]
network { name = "private" }
}Про сеть. Сервер должен быть в сети с роутером и внешним шлюзом, иначе у него не будет интернета. Точные имена образа, flavor и сетей возьмите из панели или командами openstack image list, openstack flavor list, openstack network list.
Запуск
export OS_CLOUD=serverplus
terraform init
terraform plan
terraform apply
terraform destroy # удалить всё, что созданоБезопасность
- State-файл — секрет. В
terraform.tfstateпопадают пароли и ключи. Не коммитьте его в git; храните в защищённом backend (например, в S3-хранилище serverplus) с шифрованием. - Используйте application credentials, а не пароль аккаунта — их можно отозвать в один клик.
- Секреты передавайте через переменные и окружение (
TF_VAR_...), а не хардкодом в.tf.
Частые вопросы
Провайдер не аутентифицируется. Проверьте OS_CLOUD=serverplus и корректность clouds.yaml (identity_api_version: 3).
Terraform не находит образ или flavor. Имена должны совпадать точно — сверьтесь с openstack image list и openstack flavor list.
Не выдаётся floating IP. Уточните имя внешней сети (пула): openstack network list --external.