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