Cloud VPS на базе OpenStack предоставляет полноценный REST API, чтобы можно было взаимодействовать с облаком без графического интерфейса: создавать серверы, управлять дисками, сетью и безопасностью. Это удобно для автоматизации, скриптов и CI/CD.

В этой статье рассмотрим работу через openstack CLI — самый простой и удобный способ для большинства задач.

Что внутри

  1. Настройки CLI
  2. Управление серверами
  3. Управление дисками
  4. Floating IP
  5. Security Groups
  6. SSH-ключи
  7. Прямые запросы через curl
  8. Ссылки

Настройки CLI

Для работы с облаком в командной строке необходимо установить и настроить утилиту OpenStack CLI одним из двух способов:

  1. Файл clouds.yaml (рекомендуется) — постоянная конфигурация, настраивается один раз и используется во всех сессиях. Поддерживает несколько профилей. Пароль можно хранить в отдельном файле, чтобы не вводить его каждый раз. Подходит, если нужно часто работать с облаком в CLI. Этот способ подробно описан ниже.
  2. RC файл (openrc) — временная конфигурация, настраивается для текущей сессии терминала. Поддерживает только один профиль. Пароль нужно вводить при выполнении любой команды. Подходит, если необходимость работать с облаком в CLI возникает редко.

Шаг 1. Установить OpenStack CLI

pip install python-openstackclient

Шаг 2. Настроить clouds.yaml

Загрузите файл в панели управления облаком. Раздел «Project → API Access → Download OpenStack RC File → OpenStack clouds.yaml File».

По умолчанию содержимое файла будет выглядеть так:

clouds:
openstack:
auth:
auth_url: https://cloudpanel.vps.ua:5000
username: "alex.shevchenko@gmail.com"
project_id: c2283c7578884ea9bbf691c2002d586d
project_name: "alex.shevchenko@gmail.com"
user_domain_name: "VPS.ua"
regions:
- Роттердам, Нидерланды
- Львов, Украина
interface: "public"
identity_api_version: 3

Файл не работает из коробки. Вам нужно изменить параметр regions. В загруженном файле Openstack оформляет регионы кириллицей, но они должны соответствовать значениям самого облака и записаны в виде Netherlands и/или Ukraine.

Кроме этого, в одной сущности openstack может быть указан только один регион. Если у вас есть серверы в двух регионах, нужно создать две сущности openstack.

Рабочий файл для двух регионов будет выглядеть следующим образом (если используете только один регион, можете удалить другой):

clouds:
openstack-nl:
auth:
auth_url: https://eucloudpanel.vps.ua:5000
username: "YOUR_USERNAME"
project_id: YOUR_NL_PROJECT_ID
project_name: "YOUR_PROJECT_NAME"
user_domain_name: "VPS.ua"
region_name: "Netherlands"
interface: "public"
identity_api_version: 3

openstack-ua:
auth:
auth_url: https://cloudpanel.vps.ua:5000
username: "YOUR_USERNAME"
project_id: YOUR_UA_PROJECT_ID
project_name: "YOUR_PROJECT_NAME"
user_domain_name: "VPS.ua"
region_name: "Ukraine"
interface: "public"
identity_api_version: 3

Шаг 3. Настройка хранения пароля в отдельном файле

Это необходимо для того, чтобы не вводить пароль при выполнении каждой команды.

Создайте файл ~/.config/openstack/secure.yaml — CLI автоматически подхватит файл с этим названием (если используете только один регион, можете удалить другой):

clouds:
openstack-nl:
auth:
password: "YOUR_PASSWORD"
openstack-ua:
auth:
password: "YOUR_PASSWORD"

Шаг 4. Проверить, что все работает

Для проверки выполните команду, которая покажет список серверов в регионе, указанном с помощью флага –os-cloud.

openstack --os-cloud=openstack-nl server list

Указания региона

Флаг –os-cloud нужно указывать в каждой команде. Даже если в конфигурационном файле только один регион. Без этого флага OpenStack CLI не сможет выполнить команду, потому что не поймет, к какому облаку вы обращаетесь. Допустимые значения:

  • –os-cloud=openstack-nl — Нидерланды
  • –os-cloud=openstack-ua — Украина

Можно также задать регион на сессию. Удобно при продолжительной работе в одном регионе.

# Установить регион «Нидерланды»
export OS_CLOUD=openstack-nl
openstack server list

# Переключиться на регион «Украина»
export OS_CLOUD=openstack-ua
openstack server list

Управление серверами

Список серверов

openstack --os-cloud=openstack-nl server list

Статус конкретного сервера

openstack --os-cloud=openstack-nl server show SERVER_ID

Создать сервер

Обратите внимание, что все параметры, кроме последнего, должны быть в кавычках.

 openstack --os-cloud=openstack-nl server create 
--image "IMAGE_ID"
--flavor "FLAVOR_ID"
--key-name "KEY_NAME"
--network "NETWORK_ID"
--security-group "SG_ID"
--boot-from-volume VOLUME_SIZE_GB
server-name

ID ресурсов можно получить с помощью следующих команд:

# образы ОС
openstack --os-cloud=openstack-nl image list

# конфигурации (CPU/RAM)
openstack --os-cloud=openstack-nl flavor list

# сети
openstack --os-cloud=openstack-nl network list

# security groups
openstack --os-cloud=openstack-nl security group list

# SSH-ключи
openstack --os-cloud=openstack-nl keypair list

Флаг –boot-from-volume 50 обязателен — в нашем облаке все конфигурации идут без встроенного диска. Число — размер загрузочного диска в ГБ.

Если нужно использовать несколько security groups, добавьте несколько флагов c новой строки:

 --security-group "SG_ID_1" 
--security-group "SG_ID_2"

Запустить/остановить/перезагрузить сервер

openstack --os-cloud=openstack-nl server start SERVER_ID
openstack --os-cloud=openstack-nl server stop SERVER_ID
openstack --os-cloud=openstack-nl server reboot SERVER_ID
openstack --os-cloud=openstack-nl server reboot --hard SERVER_ID

Удалить сервер

openstack --os-cloud=openstack-nl server delete SERVER_ID

Управление дисками

Список дисков

openstack --os-cloud=openstack-nl volume list

Создать диск

openstack --os-cloud=openstack-nl volume create --size 50 my-volume

Подключить диск к серверу

openstack --os-cloud=openstack-nl server add volume SERVER_ID VOLUME_ID

Отключить диск от сервера

openstack --os-cloud=openstack-nl server remove volume SERVER_ID VOLUME_ID

Удалить диск

Сначала диск нужно отсоединить от сервера.

openstack --os-cloud=openstack-nl volume delete VOLUME_ID

Floating IP

Floating IP — публичный IP-адрес, который можно выделить из пула и привязать к серверу.

Список выделенных Floating IP

openstack --os-cloud=openstack-nl floating ip list

Выделить новый Floating IP

Сначала узнайте имя внешней сети:

openstack --os-cloud=openstack-nl network list --external

Затем выделите IP:

openstack --os-cloud=openstack-nl floating ip create EXTERNAL_NETWORK_ID

Привязать Floating IP к серверу

openstack --os-cloud=openstack-nl server add floating ip SERVER_ID FLOATING_IP_ADDRESS

Отвязать Floating IP

openstack --os-cloud=openstack-nl server remove floating ip SERVER_ID FLOATING_IP_ADDRESS

Удалить Floating IP

openstack --os-cloud=openstack-nl floating ip delete FLOATING_IP_ADDRESS

Security Groups

Security groups — это правила фильтрации входящего и исходящего трафика. Встроенный файерволл для вашего облака. Более подробно: «Как работать с группами безопасности в OpenStack».

Список security groups

openstack --os-cloud=openstack-nl security group list

Создать security group

openstack --os-cloud=openstack-nl security group create \
--description "Web servers" web-servers

Добавить правила

# Разрешить входящий SSH
openstack --os-cloud=openstack-nl security group rule create \
--protocol tcp --dst-port 22 --remote-ip 0.0.0.0/0 \
--ingress SG_ID

# Разрешить входящий HTTP
openstack --os-cloud=openstack-nl security group rule create \
--protocol tcp --dst-port 80 --remote-ip 0.0.0.0/0 \
--ingress SG_ID

# Разрешить входящий HTTPS
openstack --os-cloud=openstack-nl security group rule create \
--protocol tcp --dst-port 443 --remote-ip 0.0.0.0/0 \
--ingress SG_ID

Применить security group к серверу

openstack --os-cloud=openstack-nl server add security group SERVER_ID SG_ID

Удалить security group

openstack --os-cloud=openstack-nl security group delete SG_ID

SSH-ключи

Список ключей

openstack --os-cloud=openstack-nl keypair list

Создать новый ключ

openstack --os-cloud=openstack-nl keypair create my-key > my-key.pem
chmod 600 my-key.pem

Скачать публичный ключ

openstack --os-cloud=openstack-nl keypair create 
--public-key ~/.ssh/id_rsa.pub my-key

Удалить ключ

openstack --os-cloud=openstack-nl keypair delete my-key

Прямые запросы через curl

Если требуется автоматизация без установки CLI, например в bash-скриптах или средах, где нельзя установить Python, можно обращаться к API напрямую через HTTP. Это стандартный OpenStack REST API.

Полезно для: интеграций, скриптов, дебагов на уровне HTTP.

Полная документация по всем эндпоинтам

Еще несколько полезных источников: