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, додайте декілька прапорів з нового рядка:

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

Повна документація по всіх ендпоінтах

Ще декілька корисних джерел: