company_banner

Работа с 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 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_id> --nic net-id=<id сети> --key-name myKey --block-device id=<image_id>,source=image,dest=volume,size=0,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 мы рассмотрим в следующих публикациях.

    Читателей, которые по тем или иным причинам не могут оставлять комментарии здесь, приглашаем в наш блог.
    • +8
    • 11,2k
    • 5
    Selectel
    95,27
    ИТ-инфраструктура для бизнеса
    Поделиться публикацией

    Комментарии 5

      0
      Всегда столько интересных и красивых статей, но на сайте в разделе selectel.ru/services/cloud/ нет даже элементарных ползунков чтобы посчитать свой рассход на неделю-месяц-год… Каждый раз хочу и посмотреть и тут же закрываю эту страницу, ибо считать самому не очень хочется.

      Посмотрите как сделано у тех же: infoboxcloud, clodo и т.д.(не реклама). Банальное качественное юзабилити, а повышение конверсии в разы — Ползунки вместо портянки текста.
        +2
        Кажется, вы говорите про совершенно другую услугу.
        0
        Я так понимаю, ползунков нету из-за немного иной реализации: платишь не за выделенное, а за потребленное кол-во ресурсов. А эта цифра для каждого облака индивидуальна и предварительно никто даже ориентировочно не скажет.
          +1
          Всё верно.

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

      Самое читаемое