Работа с API виртуального приватного облака: консольные клиенты

Продолжаем серию публикаций о новой услуге «Виртуальное приватное облако». Сегодня мы расскажем об OpenStack API и покажем, как можно взаимодействовать с ним с помощью консольных клиентов.

Создаем пользователя

Прежде чем начинать работу с API, нужно создать нового пользователя и добавить его в проект. В меню «Виртуальное приватное облако» выберем пункт «Пользователи»:

VPC создание пользователя

Откроется страница со списком пользователей:

api users

Список пока еще пуст. Нажимаем на кнопку «Создать пользователя», в открывшемся окне вводим его имя и опять нажимаем на кнопку «Создать». Пароль для входа в панель будет сгенерирован автоматически. Просмотрим свойства нового пользователя, нажав на значок рядом с его именем в списке:

OpenStack API

Нажмем на ссылку «Добавить в проект» и выберем из открывшегося списка проекты, к которым будет иметь доступ созданный пользователь.

После этого пользователь будет отображен в панелях управления этих проектов. Рядом с именем пользователя будет указана ссылка, по которой можно получить доступ к ресурсам проекта через браузер:

Open Stack API

Перейдем по этой ссылке и войдем в проект под учетной записью созданного пользователя. После этого перейдем на вкладку «Доступ» и скачаем RC-файл (он представляет собой скрипт, с помощью которого консольные клиенты могут авторизовываться в Identity API v3).

Устанавливаем ПО

Чтобы настроить систему для работы с проектом, потребуется установить дополнительное ПО. В этой статье мы приводим инструкцию по установке для OC Ubuntu 14.04. Для других ОС команды могут отличаться; с инструкциями для ОС Debian 7.0 и CentOS 6.5 можно ознакомиться непосредственно в панели управления (вкладка «Доступ»).

Установим следующие пакеты:

apt-get update
apt-get install curl python-pip python-dev git libxml2-dev libxslt1-dev python-keystoneclient python-heatclient python-novaclient python-glanceclient python-neutronclient 

Далее установим ПО, которое в репозиториях Ubuntu либо вообще отсутствует, либо присутствует, но в устаревших версиях:

$ pip install git+https://github.com/openstack/python-cinderclient
$ pip install cliff --upgrade
$ pip install python-openstackclient

После этого выполним команду:

$ source rc.sh

Программа запросит пароль. Введем повторно пароль пользователя, под учетной записью которого мы вошли во внешнюю панель.
Теперь можно приступать к работе.

Просмотр информации о сетях

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

$ neutron net-list
+--------------------------------------+------------------+-----------------------------------------------------+
| id                                   | name             | subnets                                             |
+--------------------------------------+------------------+-----------------------------------------------------+
| 1c037362-487f-4103-a73b-6cba3f5532dc | nat              | b7be542a-2eef-465e-aacd-34a0c83e6afa 192.168.0.0/24 |
| ab2264dd-bde8-4a97-b0da-5fea63191019 | external-network | 102a9263-2d84-4335-acfb-6583ac8e70aa                |
|                                      |                  | aa9e4fc4-63b0-432e-bcbd-82a613310acb                |
| fce90252-7d99-4fc7-80ae-ef763d12938d | newnetwork       | 5a1a68f9-b885-47b7-9c7e-6f0e08145e3b 192.168.1.0/24 |
+--------------------------------------+------------------+-----------------------------------------------------+

Каждая сеть имеет идентификационный номер (графа ID); его нужно будет указать при создании нового сервера.

Активировать сетевую конфигурацию можно и через графический интерфейс (подробнее об этом см. здесь).

Операции с серверами

Просмотрим список доступных образов:

$ glance image-list
+--------------------------------------+--------------------------+-------------+------------------+-------------+--------+
| ID                                   | Name                     | Disk Format | Container Format | Size        | Status |
+--------------------------------------+--------------------------+-------------+------------------+-------------+--------+
| 552bc246-5ae7-4b48-9a64-e1e881a64cab | CentOS 6 32-bit          | raw         | bare             | 219152384   | active |
| 708a7642-80ab-486e-a031-e6b6a652004c | CentOS 6 32-bit          | raw         | bare             | 2147483648  | active |
| 978d81c0-c508-412d-9847-fb8cec294410 | CentOS 6 64-bit          | raw         | bare             | 263192576   | active |
| ee5d5bb7-8a31-467a-8bbf-f6f5bbb79334 | CentOS 6 64-bit          | raw         | bare             | 2147483648  | active |
| 647bce00-5f29-49fe-9e83-8b33cb188d17 | CentOS 7 64-bit          | raw         | bare             | 2147483648  | active |
| dff9df74-b7b3-44b0-92f3-40cb4dfd9a94 | CoreOS                   | qcow2       | ovf              | 449839104   | active |
| 3eda89b9-9ce0-47b7-9907-a2978d88632e | CoreOS                   | qcow2       | ovf              | 413007872   | active |
| d2033c50-e8f4-4ff6-9c21-cade02007f34 | Debian 7 (Wheezy) 32-bit | raw         | bare             | 10485760    | active |
| ba78ce9b-f800-4fb2-ad85-a68ca0f19cb8 | Debian 7 (Wheezy) 32-bit | raw         | bare             | 2147483648  | active |
| b2c8bc6a-dbb8-4a1a-ab8e-c63f5f2b9bdf | Debian 7 (Wheezy) 64-bit | raw         | bare             | 11534336    | active |
| 18a18569-389c-4144-82ae-e5e85862fca4 | Debian 7 (Wheezy) 64-bit | raw         | bare             | 2147483648  | active |
| 8c3233c9-25cd-4181-a422-aa24032255cc | OpenSUSE 13.1 32-bit     | raw         | bare             | 74448896    | active |
| d965d37c-6796-40bd-8966-d0d7f7f41313 | OpenSUSE 13.1 32-bit     | raw         | bare             | 3221225472  | active |
| b77015d0-3eba-4841-9d02-7e9d606d343a | OpenSUSE 13.1 64-bit     | raw         | bare             | 76546048    | active |
| b20a1e1a-3c81-4d13-926f-eb39546b9b36 | OpenSUSE 13.1 64-bit     | raw         | bare             | 3221225472  | active |
| c168e0e5-c01e-44ec-be36-1c10e2da94a5 | selectel-rescue-initrd   | ari         | ari              | 13665966    | active |
| 0b117761-4ab5-40d7-a610-127d1e10206f | selectel-rescue-kernel   | aki         | aki              | 5634192     | active |
| c2fce974-4aeb-473a-9475-176207c3f293 | Ubuntu 12.04 LTS 32-bit  | raw         | bare             | 22020096    | active |
| eeb9143c-1500-4086-8025-307bc96fc467 | Ubuntu 12.04 LTS 32-bit  | raw         | bare             | 2147483648  | active |
| dbdd5cb3-f73f-4d98-85e9-eb333463e431 | Ubuntu 12.04 LTS 64-bit  | raw         | bare             | 26214400    | active |
| c1231800-9423-4018-b138-af8860ea8239 | Ubuntu 12.04 LTS 64-bit  | raw         | bare             | 2147483648  | active |
| c61cfa0d-3f7b-489f-8e55-4904a0d6e830 | Ubuntu 14.04 LTS 32-bit  | raw         | bare             | 26214400    | active |
| fbb2bb25-5058-4f06-85c8-6d3ca268e686 | Ubuntu 14.04 LTS 32-bit  | raw         | bare             | 2147483648  | active |
| e024042b-80f5-4eea-ae29-733ae32f65e6 | Ubuntu 14.04 LTS 64-bit  | raw         | bare             | 33554432    | active |
| f10ab2a9-478d-4401-9371-384bd9731156 | Ubuntu 14.04 LTS 64-bit  | raw         | bare             | 2147483648  | active |
| 6a4b53e6-109c-4fc0-9535-b97bc2912de6 | windows_2012_final       | raw         | bare             | 10737418240 | active |
+--------------------------------------+--------------------------+-------------+------------------+-------------+--------+

Выбрав нужный образ, скопируем его id — он понадобится при создании сервера.
Теперь создадим требуемую конфигурацию сервера (в терминологии OpenStaсk они обозначаются термином flavor, с трудом поддающимся переводу на русский язык):

$ nova --is-public False flavor-create <имя конфигурации> auto <объём памяти> <ёмкость жёсткого диска> <количество ядер>

Размер жёсткого диска в этой команде следует указать равным нулю. В нашей реализации в качестве корневого (системного) диска к машине присоединяется том Cinder. Такое решение было выбрано по причине гибкости: в отличие от локальных дисков (в терминологии Amazon они называются instance store), тома Cinder можно отключать и присоединять к другим машинам.

Ключ auto в этой команде означает, что ID конфигурации сервера будет сгенерирован автоматически:

+------------------------------------+------+---------+----+---------+----+-----+-----------+---------+
|ID                                  |Name  |Memory,MB|Disk|Ephemeral|Swap|VCPUs|RXTX_Factor|Is_Public|
+------------------------------------+------+---------+----+---------+----+-----+-----------+---------+
|fc275dcc-f51a-48c3-b0c3-c3fdd300dd65|myflvr| 1024    | 0  | 0       |    | 2   | 1.0       | True    |
+------------------------------------+------+---------+----+---------+----+-----+-----------+---------+

ID нужно скопировать — он также понадобится при создании сервера.
Затем создадим SSH-ключ:

$ nova keypair-add <имя ключа> <имя файла>
$ chmod 600 

Эта команда выведет в файл приватный ключ, с помощью которого можно будет подключаться к виртуальным машинам по SSH (команда соединения в этом случае будет выглядеть так: ssh -i <имя файла> <IP-адрес сервера>).

Если у вас уже есть пара «приватный ключ-публичный ключ», можно указать публичный ключ в качестве аргумента:

$ nova keypair-add <имя ключа> pub-key <путь к публичному ключу>  

Например:

$ nova keypair-add myKey --pub-key /home/user/.ssh/id_rsa.pub

SSH-ключи можно также добавлять из панели управления (вкладка «Доступ» в свойствах проекта).

Выбрав образ и конфигурацию, перейдем непосредственно к созданию сервера:

$ nova boot <имя сервера> --flavor <flavor_id> --nic net-id=<id сети> --key-name myKey --block-device id=<image_id>,source=image,dest=volume,size=10,device=vda,bootindex=0

После команды boot указываем имя сервера, далее — ID выбранного образа, ID конфигурации и SSH-ключ.

При создании нашей панели управления и образов мы старались исключить возможность передачи паролей в незашифрованном виде по сети. Именно поэтому наши образы принимают не пароль, а его хеш, генерируемый панелью управления.

Чтобы получить доступ к машине из консоли, достаточно будет ввести логин и нажать Enter. Вход по SSH будет возможен только с помощью ключа.

Операции с дисками

Создать новый диск и подсоединить его к серверу можно с помощью команды:

$ cinder create --name  <имя диска> <размер, ГБ>

В случае успешного создания диска на консоль выводится таблица с его основными характеристиками:

+-------------------+--------------------------------------+
|      Property     |                Value                 |
+-------------------+--------------------------------------+
|    attachments    |                  []                  |
| availability_zone |                ru-1a                 |
|      bootable     |                false                 |
|     created_at    |      2014-10-23T11:10:15.000000      |
|    description    |                 None                 |
|     encrypted     |                False                 |
|         id        | 76586803-9cfd-4f75-931d-0a4dee98e496 |
|      metadata     |                  {}                  |
|        name       |                mydisk                |
|        size       |                  5                   |
|    snapshot_id    |                 None                 |
|    source_volid   |                 None                 |
|       status      |               creating               |
|      user_id      |   6f862e43d4a84f359928948fb658d695   |
|    volume_type    |               default                |
+-------------------+--------------------------------------+

Чтобы подключить диск к серверу, скопируем из этой таблицы параметр id и выполним команду:

$ nova volume-attach <имя сервера> <id диска>

Создание и назначение IP-адреса

Чтобы создать внешний IP-адрес, по которому сервер будет доступен из Интернета, выполним команду:

$ neutron floatingip-create external-network

Назначим созданный адрес серверу:

$ nova floating-ip-associate <имя сервера> <адрес>

Управление питанием и перезагрузка

Существует два способа перезагрузки сервера: программная и аппаратная (через отключение питания) перезагрузка.

Для программной перезагрузки используется следующая команда:

$ nova reboot <имя сервера>

а для аппаратной —

$ nova reboot --hard <имя сервера>

Управление питанием осуществляет при помощь команд start и stop:

#включить указанный сервер
$ nova start <имя сервера>

#выключить указанный сервер
$ nova stop <имя сервера>

Операции с сетевыми портами

Создадим новую сеть:

$ neutron net-create <имя сети>

По выполнении команды на консоль будет выведена таблица с информацией о сети:

+----------------+--------------------------------------+
| Field          | Value                                |
+----------------+--------------------------------------+
| admin_state_up | True                                 |
| id             | add73ca5-6120-43bd-bb56-d1d8d71d21ac |
| name           | localnet                             |
| shared         | False                                |
| status         | ACTIVE                               |
| subnets        |                                      |
| tenant_id      | d15391cc95474b1ab6bd81fb2a73bc5c     |
+----------------+--------------------------------------+

Создать в этой сети подсеть можно при помощи следующей команды:

$ neutron subnet-create --name 192.168.1.0/24  192.168.1.0/24 <id сети>

(id сети берём из вывода предыдущей команды).

Затем создадим в сети порт:

$ neutron port-create <имя сети>

и подключим к нему сервер:

$ nova interface-attach --port-id <id порта> <имя сервера>

Заключение

Эта статья представляет собой лишь краткое введение в OpenStack API. Если у вас есть вопросы по работе с консольными клиентами, мы ответим на них в комментариях.

Более подробно особенности взаимодействия с API мы рассмотрим в следующих публикациях.

Что еще почитать по теме

T-Rex 30 марта 2021

Что такое SMTP-протокол и как он устроен?

SMTP (Simple Mail Transfer Protocol) — протокол передачи почты. Он был представлен еще в 1982 году, но не теряет актуальности до сих пор. В статье разбираемся, какие задачи решает протокол и как он ра…
T-Rex 30 марта 2021
Владимир Туров 1 сентября 2020

Дело совершенно секретного iPod

Это был обычный серый день в конце 2005 года. Я сидел на рабочем месте и писал код для следующей версии iPod. Вдруг без стука ворвался директор ПО для iPod, начальник моего начальника, и закрыл дверь.
Владимир Туров 1 сентября 2020
T-Rex 21 августа 2020

TrendForce: цены на SSD упадут

Эксперты DRAMeXchange предсказывают значительное падение цен на оперативную память и твердотельные накопители в ближайшее время. Причина — сокращение спроса на чипы для NAND и DRAM.
T-Rex 21 августа 2020

Новое в блоге

Михаил Фомин 24 июня 2022

Docker Swarm VS Kubernetes — как бизнес выбирает оркестраторы

Рассказываем, для каких задач бизнесу больше подойдет Docker Swarm, а когда следует выбрать Kubernetes.
Михаил Фомин 24 июня 2022
Владимир Туров 5 октября 2022

DBaaS: что такое облачные базы данных

Рассказываем о сервисе управляемых баз данных в облаке и объясняем, как разделяется ответственность за работу кластеров БД между провайдером и клиентом.
Владимир Туров 5 октября 2022
Ульяна Малышева 30 сентября 2022

«Нулевой» локальный диск. Как мы запустили облако только с сетевыми дисками и приручили Ceph

Чем хороши сетевые диски и почему именно Ceph, рассказал директор по развитию ядра облачной платформы Иван Романько.
Ульяна Малышева 30 сентября 2022
Валентин Тимофеев 30 сентября 2022

Как проходит онбординг сотрудников ИТО? Что нужно, чтобы выйти на смену в дата-центр

Рассказываем, как обучаем новых сотрудников, какие задачи и испытания проходят инженеры прежде, чем выйти на свою первую смену.
Валентин Тимофеев 30 сентября 2022