Создание виртуального сервера

Переход к созданию

Войдите в консоль управления PS Cloud Services и выберите нужный проект в разделе Облачные серверы.

Перейдите в раздел Серверы и нажмите Создать в правом верхнем углу.

Настройка базовых параметров

Введите название сервера (латиница, цифры, -, _, пробелы).

Выберите тип и конфигурацию: количество ядер и объем RAM.

Доступны следующие типы конфигураций:

  • d1 — базовые конфигурации для тестов и простых задач.
  • g1 — оптимизированы для вычислений и работы с GPU.
  • f1, f2 — повышенная производительность CPU и RAM.

Для некоторых конфигураций доступен только локальный диск.
В этом случае данные хранятся непосредственно на сервере и не реплицируются в хранилище. Такой вариант обеспечивает более высокую производительность, но имеет меньшую отказоустойчивость.

Выбор образа

Перейдите на вкладку Операционная система.

Можно использовать:

  • готовый образ из каталога;
  • свой загруженный образ;
  • снимок диска (snapshot);
  • существующий диск.

Результат: выбранный источник будет использован как загрузочный диск сервера.

Настройка дисков

Загрузочный диск добавляется автоматически.

Чтобы изменить его параметры:

  1. Нажмите на иконку шестеренки.
  2. Укажите:
  • название диска;
  • тип диска;
  • объем.

Для добавления дополнительных дисков нажмите Добавить и выберите:

  • Добавить существующий диск
  • Создать диск

Подключение сети

При создании сервера можно использовать разные варианты сетевого подключения.

Стандартная сеть

  1. В блоке Сети нажмите Добавить.
  2. Выберите нужную подсеть.
  3. При необходимости выберите порт подключения.
  4. Чтобы сервер получил внешний адрес, включите параметр Использовать плавающий IP.

Результат: сервер получает внешний IP-адрес через Floating IP.

Выделенная подсеть

  1. В блоке Сети выберите доступную выделенную подсеть.
  2. При необходимости можно добавить несколько сетей.

В этом сценарии:

  • создавать виртуальный роутер не требуется;
  • указывать Floating IP не нужно.

Результат: сервер автоматически получает публичный IP-адрес из выделенной подсети.

Установка правил доступа

Выберите одну из групп безопасности:

  • Только SSH и WWW
  • Только SSH
  • Все разрешено

Группы безопасности работают как сетевой фильтр.
Если выбрать Все разрешено, сервер будет открыт по всем портам.

Настройки можно изменить позже.

Настройка доступа

В блоке SSH-ключ нажмите Добавить и выберите один из вариантов:

  • Импортировать существующий ключ
  • Сгенерировать новый ключ

При необходимости можно включить параметр Использовать пароль.

Подтверждение

Нажмите Продолжить, проверьте параметры и подтвердите создание сервера.

После запуска сервер появится в списке со статусом creating.

Важное условие

Все команды в инструкции необходимо выполнять в одной сессии терминала.
При закрытии терминала переменные окружения будут сброшены.

Предварительные условия

Перед началом убедитесь, что у вас есть:

  • доступ к проекту в PS Cloud Services
  • токен для работы с API (OS_TOKEN)
  • установленный curl
  • терминал Linux или macOS

Аутентификация и подготовка окружения

Экспорт токена

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 --- имя образа
  • id --- UUID образа
  • status --- должен быть active

Сохранение ID образа

Пример выбранного образа:

"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)

Получите список доступных 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}"

Создание диска из образа (volume-backed)

Для некоторых 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"

Создание виртуальной машины

Запрос на создание VM

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" отсутствует.

Типовые проблемы и решения

Ошибка 401 Unauthorized

Причины:

  • токен не экспортирован
  • переменные окружения потеряны (новая сессия терминала)

Решение:

echo "OS_TOKEN length: ${#OS_TOKEN}"

Если значение 0 --- повторно экспортируйте токен.

Ошибка 403 Forbidden

Only volume-backed servers are allowed for flavors with zero disk

Причина: выбран flavor без локального диска.

Решение:

  • создать диск из образа
  • использовать block_device_mapping_v2

Статус сервера ERROR

Сообщение:

Failed to allocate the network(s)

Причины:

  • некорректная сеть
  • сеть недоступна или не привязана к проекту

Решение:

  • проверить NETWORK_ID
  • убедиться, что сеть находится в статусе ACTIVE

Результат

После выполнения инструкции:

  • создан диск из образа операционной системы
  • виртуальная машина создана через API
  • VM находится в статусе ACTIVE и доступна в проекте

Предварительные условия

Перед началом убедитесь, что:

  • есть доступ к проекту в PS Cloud Services;
  • получен API-токен OpenStack (OS_TOKEN);
  • установлен Terraform версии 1.3 или выше;
  • используется Linux или macOS;
  • в проекте создан SSH keypair;
  • выбран flavor без локального диска (zero disk).

Создание рабочей директории

Создайте директорию для Terraform-проекта и перейдите в неe:

mkdir terraform-vm
cd terraform-vm

Все дальнейшие команды выполняются из этой директории.


Создание файла provider.tf

nano 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.tf

nano 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.tfvars

nano 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.tf

nano data.tf
data "openstack_compute_flavor_v2" "flavor" {
  name = var.flavor_name
}

data "openstack_networking_network_v2" "network" {
  name = var.network_name
}

Сохраните файл.


Создание файла main.tf

nano main.tf

Блок создания volume

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.tf

nano 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

terraform init

Ожидаемый результат:

  • провайдер OpenStack успешно загружен;
  • ошибок нет.

Проверка плана

terraform plan

Проверьте, что Terraform планирует:

  • создание одного volume;
  • создание одного сервера;
  • отсутствие операций удаления.

Создание ресурсов

terraform apply

Введите yes для подтверждения.

Ожидаемый результат:

  • volume создан;
  • сервер создан;
  • VM находится в статусе ACTIVE.

Важно: файл 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)

Причина: указана недоступная сеть.

Решение: проверить имя сети и ее статус.


Завершение

В результате выполненных шагов:

  • создан корневой диск из образа;
  • создана виртуальная машина с загрузкой с volume;
  • состояние инфраструктуры зафиксировано в Terraform.

Конфигурацию можно расширять без пересоздания ресурсов, добавляя новые Terraform-блоки (Floating IP, security groups, SSH-доступ).

Предварительные условия

Перед началом убедитесь, что:

  • есть доступ к проекту в PS Cloud Services;
  • установлен OpenStack CLI;
  • загружен файл openrc.sh для проекта;
  • в проекте создан SSH keypair;
  • известны ID образа и сети.

Авторизация в OpenStack

Загрузите переменные окружения из файла openrc.sh:

source ~/Downloads/<PROJECT_NAME>-openrc.sh

Введите пароль пользователя проекта.

Проверьте, что переменные окружения установлены:

env | grep -E '^OS_'

Результат: отображаются переменные OS_AUTH_URL, OS_PROJECT_NAME, OS_USERNAME и другие.


Проверка доступных ресурсов

Проверка образов

openstack image list

Скопируйте ID выбранного образа.

Проверка flavor

openstack flavor list

Если выбран flavor с disk = 0, сервер необходимо создавать с загрузкой с volume.

Проверка сети

openstack network list

Скопируйте имя или ID сети, которая будет использоваться сервером.

Проверка SSH keypair

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

Результат

  • сервер создан;
  • корневой диск создается автоматически;
  • сервер получает внутренний IP-адрес.

Проверьте состояние:

openstack server list

Ожидаемый статус: ACTIVE.


Создание сервера без локального диска (zero disk)

Если выбран flavor без локального диска (Disk = 0), сервер должен загружаться с volume.

Создание корневого volume

openstack volume create \
  --image <IMAGE_ID> \
  --size 20 \
  --type ceph-hdd \
  cli-root-disk

Проверьте статус:

openstack volume show cli-root-disk

Ожидаемо:

status = available

Создание сервера с загрузкой с volume

openstack server create \
  --flavor d1.ram2cpu1 \
  --volume cli-root-disk \
  --network <NETWORK_ID> \
  --key-name <KEYPAIR_NAME> \
  server-volume

Результат

  • сервер создан;
  • загрузка выполняется с volume;
  • внутренний IP назначен автоматически.

Проверьте состояние:

openstack server list

Ожидаемый статус: ACTIVE.


Назначение Floating IP

Проверьте доступные IP:

openstack floating ip list

Если нет свободного IP:

openstack floating ip create <FLOATING_NETWORK_ID>

Привязка IP к серверу:

openstack server add floating ip <SERVER_NAME> <FLOATING_IP>

Проверка Security Group

По умолчанию входящий доступ может быть ограничен.

Проверьте правила:

openstack security group rule list default

Для SSH требуется правило:

  • протокол: tcp
  • порт: 22
  • источник: 0.0.0.0/0
  • направление: ingress

Если правило отсутствует:

openstack security group rule create \
  --proto tcp \
  --dst-port 22 \
  --remote-ip 0.0.0.0/0 \ 
  default

Подключение по SSH

ssh ubuntu@<FLOATING_IP>

Итог

В зависимости от выбранного flavor:

  • при наличии локального диска сервер создается напрямую из образа;
  • при отсутствии локального диска сервер создаётся с загрузкой с volume.

Оба сценария полностью поддерживаются OpenStack CLI.

Поддержка

Если возникли вопросы, обратитесь в техническую поддержку PS Cloud Services.

question
Не нашли подходящего ответа?
Напишите запрос в службу поддержки
Написать сейчас
  1. Main