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

OpenStack 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 мы рассмотрим в следующих публикациях.