Войдите в консоль управления PS Cloud Services и выберите нужный проект в разделе Облачные серверы.
Перейдите в раздел Серверы и нажмите Создать в правом верхнем углу.
Введите название сервера (латиница, цифры, -, _, пробелы).
Выберите тип и конфигурацию: количество ядер и объем RAM.
Доступны следующие типы конфигураций:
Для некоторых конфигураций доступен только локальный диск.
В этом случае данные хранятся непосредственно на сервере и не реплицируются в хранилище. Такой вариант обеспечивает более высокую производительность, но имеет меньшую отказоустойчивость.
Перейдите на вкладку Операционная система.
Можно использовать:
Результат: выбранный источник будет использован как загрузочный диск сервера.
Загрузочный диск добавляется автоматически.
Чтобы изменить его параметры:
Для добавления дополнительных дисков нажмите Добавить и выберите:
При создании сервера можно использовать разные варианты сетевого подключения.
Результат: сервер получает внешний IP-адрес через Floating IP.
В этом сценарии:
Результат: сервер автоматически получает публичный IP-адрес из выделенной подсети.
Выберите одну из групп безопасности:
Группы безопасности работают как сетевой фильтр.
Если выбрать Все разрешено, сервер будет открыт по всем портам.
Настройки можно изменить позже.
В блоке SSH-ключ нажмите Добавить и выберите один из вариантов:
При необходимости можно включить параметр Использовать пароль.
Нажмите Продолжить, проверьте параметры и подтвердите создание сервера.
После запуска сервер появится в списке со статусом creating.
Все команды в инструкции необходимо выполнять в одной сессии терминала.
При закрытии терминала переменные окружения будут сброшены.
Перед началом убедитесь, что у вас есть:
export OS_TOKEN="ВАШ_API_TOKEN"
echo "OS_TOKEN length: ${#OS_TOKEN}"
Ожидаемый результат --- значение больше 0.
Если длина равна 0, токен не установлен и запросы к API выполняться не
будут.
curl -s -H "X-Auth-Token: $OS_TOKEN" "https://image.kz-ala-1.pscloud.io/v2/images?limit=20"
В ответе обратите внимание на поля:
Пример выбранного образа:
"name": "<IMAGE_NAME>",
"id": "<IMAGE_ID>"
Сохраните ID в переменную:
export IMAGE_ID="<IMAGE_ID>"
echo "IMAGE_ID length: ${#IMAGE_ID}"
Ожидаемая длина UUID --- 36 символов.
curl -i -H "X-Auth-Token: $OS_TOKEN" "https://image.kz-ala-1.pscloud.io/v2/images/$IMAGE_ID" | head -n 20
Ожидаемый результат:
HTTP/1.1 200 OK
Получите список доступных flavor:
curl -s -H "X-Auth-Token: $OS_TOKEN" "https://compute.kz-ala-1.pscloud.io/v2.1/flavors"
Выберите нужный flavor и сохраните его ID:
export FLAVOR_ID="<FLAVOR_ID>"
echo "FLAVOR_ID length: ${#FLAVOR_ID}"
Получите список сетей:
curl -s -H "X-Auth-Token: $OS_TOKEN" "https://network.kz-ala-1.pscloud.io/v2.0/networks"
Выберите сеть и сохраните ID:
export NETWORK_ID="<NETWORK_ID>"
echo "NETWORK_ID length: ${#NETWORK_ID}"
Для некоторых flavor создание VM напрямую из образа невозможно.
В этом случае используется volume-backed сценарий.
curl -s -X POST -H "X-Auth-Token: $OS_TOKEN" -H "Content-Type: application/json" "https://volume.kz-ala-1.pscloud.io/v3/volumes" -d '{
"volume": {
"name": "api-demo-vol",
"size": 20,
"imageRef": "'"$IMAGE_ID"'"
}
}'
Сохраните ID созданного диска:
export VOLUME_ID="<VOLUME_ID>"
curl -s -H "X-Auth-Token: $OS_TOKEN" "https://volume.kz-ala-1.pscloud.io/v3/volumes/$VOLUME_ID" | grep status
Ожидаемый результат:
"status": "available"
curl -s -X POST -H "X-Auth-Token: $OS_TOKEN" -H "Content-Type: application/json" "https://compute.kz-ala-1.pscloud.io/v2.1/servers" -d '{
"server": {
"name": "api-demo-vm",
"flavorRef": "'"$FLAVOR_ID"'",
"networks": [
{ "uuid": "'"$NETWORK_ID"'" }
],
"block_device_mapping_v2": [
{
"uuid": "'"$VOLUME_ID"'",
"source_type": "volume",
"destination_type": "volume",
"boot_index": 0,
"delete_on_termination": true
}
]
}
}'
Сохраните ID сервера из ответа:
export SERVER_ID="<SERVER_ID>"
Проверьте статус:
curl -s -H "X-Auth-Token: $OS_TOKEN" "https://compute.kz-ala-1.pscloud.io/v2.1/servers/$SERVER_ID" | grep -E '"id"|"name"|"status"|"fault"'
Ожидаемый результат:
"status": "ACTIVE"
При этом блок "fault" отсутствует.
Причины:
Решение:
echo "OS_TOKEN length: ${#OS_TOKEN}"
Если значение 0 --- повторно экспортируйте токен.
Only volume-backed servers are allowed for flavors with zero disk
Причина: выбран flavor без локального диска.
Решение:
Сообщение:
Failed to allocate the network(s)
Причины:
Решение:
После выполнения инструкции:
Перед началом убедитесь, что:
OS_TOKEN);Создайте директорию для Terraform-проекта и перейдите в неe:
mkdir terraform-vm
cd terraform-vm
Все дальнейшие команды выполняются из этой директории.
provider.tfnano provider.tf
Вставьте содержимое:
terraform {
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "~> 1.55"
}
}
}
provider "openstack" {
auth_url = var.auth_url
region = var.region
tenant_id = var.project_id
token = var.os_token
user_name = "token"
password = "token"
domain_name = "Default"
use_octavia = true
}
Сохраните файл (Ctrl + O, Enter) и выйдите (Ctrl + X).
variables.tfnano variables.tf
variable "auth_url" {
type = string
}
variable "region" {
type = string
}
variable "project_id" {
type = string
}
variable "os_token" {
type = string
sensitive = true
}
variable "image_id" {
type = string
}
variable "flavor_name" {
type = string
}
variable "network_name" {
type = string
}
variable "keypair_name" {
type = string
}
variable "vm_name" {
type = string
default = "terraform-vm-1"
}
variable "root_volume_name" {
type = string
default = "terraform-root-disk"
}
variable "root_volume_size_gb" {
type = number
default = 20
}
variable "root_volume_type" {
type = string
default = "ceph-hdd"
}
Сохраните файл.
terraform.tfvarsnano terraform.tfvars
auth_url = "https://<KEYSTONE_URL>"
region = "kz-ala-1"
project_id = "<PROJECT_ID>"
os_token = "<OS_TOKEN>"
image_id = "<IMAGE_ID>"
flavor_name = "d1.ram2cpu1"
network_name = "default"
keypair_name = "project-key"
Сохраните файл.
data.tfnano data.tf
data "openstack_compute_flavor_v2" "flavor" {
name = var.flavor_name
}
data "openstack_networking_network_v2" "network" {
name = var.network_name
}
Сохраните файл.
main.tfnano main.tf
resource "openstack_blockstorage_volume_v3" "root" {
name = var.root_volume_name
size = var.root_volume_size_gb
image_id = var.image_id
volume_type = var.root_volume_type
region = var.region
}
Результат:
resource "openstack_compute_instance_v2" "vm" {
name = var.vm_name
flavor_id = data.openstack_compute_flavor_v2.flavor.id
key_pair = var.keypair_name
region = var.region
network {
uuid = data.openstack_networking_network_v2.network.id
}
block_device {
uuid = openstack_blockstorage_volume_v3.root.id
source_type = "volume"
destination_type = "volume"
boot_index = 0
delete_on_termination = true
}
}
Сохраните файл.
outputs.tfnano outputs.tf
output "vm_id" {
value = openstack_compute_instance_v2.vm.id
}
output "root_volume_size_gb" {
value = openstack_blockstorage_volume_v3.root.size
}
output "root_volume_type" {
value = openstack_blockstorage_volume_v3.root.volume_type
}
Сохраните файл.
terraform init
Ожидаемый результат:
terraform plan
Проверьте, что Terraform планирует:
terraform apply
Введите yes для подтверждения.
Ожидаемый результат:
Важно: файл terraform.tfstate содержит текущее состояние созданных ресурсов. Удаление или потеря этого файла приведет к тому, что Terraform перестанет видеть созданный сервер.
terraform state list
Проверьте параметры диска:
terraform state show openstack_blockstorage_volume_v3.root
Ожидаемо:
size = 20
Проверьте параметры сервера:
terraform state show openstack_compute_instance_v2.vm
Примечание: параметр volume_size может отображаться как 0. Это не ошибка — фактический размер диска хранится в ресурсе volume.
403 Only volume-backed servers are allowed
Причина: выбран flavor без локального диска и отсутствует block_device.
Решение: использовать volume-backed сценарий.
401 Unauthorized
Причина: неверный или истекший OS_TOKEN.
Решение: обновить токен.
Failed to allocate network(s)
Причина: указана недоступная сеть.
Решение: проверить имя сети и ее статус.
В результате выполненных шагов:
Конфигурацию можно расширять без пересоздания ресурсов, добавляя новые Terraform-блоки (Floating IP, security groups, SSH-доступ).
Перед началом убедитесь, что:
openrc.sh для проекта;Загрузите переменные окружения из файла openrc.sh:
source ~/Downloads/<PROJECT_NAME>-openrc.sh
Введите пароль пользователя проекта.
Проверьте, что переменные окружения установлены:
env | grep -E '^OS_'
Результат: отображаются переменные OS_AUTH_URL, OS_PROJECT_NAME, OS_USERNAME и другие.
openstack image list
Скопируйте ID выбранного образа.
openstack flavor list
Если выбран flavor с disk = 0, сервер необходимо создавать с загрузкой с volume.
openstack network list
Скопируйте имя или ID сети, которая будет использоваться сервером.
openstack keypair list
Убедитесь, что ключ существует и будет использован для подключения по SSH.
Если выбран flavor с локальным диском (Disk > 0), сервер можно создать напрямую из образа.
openstack server create \
--flavor f1.small \
--image <IMAGE_ID> \
--network <NETWORK_ID> \
--key-name <KEYPAIR_NAME> \
server-local
Проверьте состояние:
openstack server list
Ожидаемый статус: ACTIVE.
Если выбран flavor без локального диска (Disk = 0), сервер должен загружаться с volume.
openstack volume create \
--image <IMAGE_ID> \
--size 20 \
--type ceph-hdd \
cli-root-disk
Проверьте статус:
openstack volume show cli-root-disk
Ожидаемо:
status = available
openstack server create \
--flavor d1.ram2cpu1 \
--volume cli-root-disk \
--network <NETWORK_ID> \
--key-name <KEYPAIR_NAME> \
server-volume
Проверьте состояние:
openstack server list
Ожидаемый статус: ACTIVE.
Проверьте доступные IP:
openstack floating ip list
Если нет свободного IP:
openstack floating ip create <FLOATING_NETWORK_ID>
Привязка IP к серверу:
openstack server add floating ip <SERVER_NAME> <FLOATING_IP>
По умолчанию входящий доступ может быть ограничен.
Проверьте правила:
openstack security group rule list default
Для SSH требуется правило:
tcp220.0.0.0/0ingressЕсли правило отсутствует:
openstack security group rule create \
--proto tcp \
--dst-port 22 \
--remote-ip 0.0.0.0/0 \
default
ssh ubuntu@<FLOATING_IP>
В зависимости от выбранного flavor:
Оба сценария полностью поддерживаются OpenStack CLI.
Если возникли вопросы, обратитесь в техническую поддержку PS Cloud Services.
