[Из песочницы] Установка, конфигурирование и запуск DevStack от 'А' до 'Я'

Описание DevStack


Назначение DevStack — предоставить набор инструментов, используемых для установки главных сервисов OS из исходников, необходимых для разработки и тестирования. DevStack так же показывает и описывает примеры конфигураций и запусков сервисов, а также использование клиента командной строки (CLI).

wiki.openstack.org/wiki/DevStack

Словарик:
Инстанс (instance) — виртуальная машина, созданная при помощи инструментов DevStack.

Подготовка к установке


Для установки DevStack желательно сначала создать пользователя с правами root:

sudo useradd -G sudo -m -U -s /bin/bash -p stack stack


Теперь переключаемся под только-что созданного пользователя и выкачиваем DevStack из репозитория:

su stack
cd ~
git clone https://github.com/openstack-dev/devstack.git


Если у Git ещё не установлен, поставим его командой

sudo apt-get install git -y


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

  • -b stable/kilo
  • -b stable/liberty
  • -b stable/mitaka
  • -b stable/master


Наиболее свежие из которых master и mitaka. Однако если не указывать скачиваемый бранч, то выкачается последняя версия DevStack из репозитория (HEAD), которая может содержать ошибки.

Установка


После того, как выбранная версия будет выкачана на диск, в корневом каталоге пользователя stack появится директория devstack:

stack@host:$ls
devstack


Перейдем в новую директорию и создадим в ней файл local.conf:

stack@host:$cd devstack
touch local.conf


Этот файл будет содержать конфигурацию, позволяющую нам работать с DevStack. Все параметры конфигурации должны быть описаны в секции [[local|localrc]]:

nano local.conf
[[local|localrc]]


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

############################################################
# Customize the following HOST_IP based on your installation
############################################################
ADMIN_PASSWORD=admin    # Пароль от Horizon & Keystone
MYSQL_PASSWORD=admin
RABBIT_PASSWORD=admin
SERVICE_PASSWORD=admin
SERVICE_TOKEN=admin


а также IP адрес машины, на которой будет устанавливаться DevStack:

HOST_IP=10.0.2.15


Вообще в DevStack используются два типа сетей: PUBLIC и PRIVATE, в которых используются разные типы адресов (floating и fixed соответственно). Если коротко, то Floating-адреса используются для доступа к созданному инстансу из внешней сети. При этом сам инстанс ничего о нем не знает, и вся маршрутизация трафика осуществляется средствами DevStack. Fixed адреса используются для работы внутри виртуальной сети (подробнее здесь).

Итак, сначала добавим секцию, отвечающую за распределение floating-адресов:

#PUBLIC NETWORK CONFIGURATION
Q_USE_PROVIDERNET_FOR_PUBLIC=False
FLOATING_RANGE=10.0.2.0/24
Q_FLOATING_ALLOCATION_POOL="start=10.0.2.150,end=10.0.2.201"
PUBLIC_NETWORK_NAME=external
PUBLIC_NETWORK_GATEWAY=10.0.2.1
PUBLIC_PHYSICAL_NETWORK=public
# Required for l3-agent to connect to external-network-bridge
PUBLIC_BRIDGE=br-ext


И секцию для fixed-адресов:

#PRIVATE NETWORK CONFIGURATION
NETWORK_GATEWAY=${NETWORK_GATEWAY:-15.0.0.1}
FIXED_RANGE=${FIXED_RANGE:-15.0.0.0/24}


Сохраняем файл local.conf и запускаем DevStack:

./stack.sh


Если все сделано правильно, то в результате увидим такую картину:

This is your host IP address: 10.0.2.15
This is your host IPv6 address: ::1
Horizon is now available at http://10.0.2.15/dashboard
Keystone is serving at http://10.0.2.15/identity/
The default users are: admin and demo
The password: admin


Настройка DevStack


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

Если вы хотите запустить что-то более существенное, потребуется более тонкая настройка, которая и описана ниже. Чтобы работать с DevStack, надо ввести команду:

. openrc admin admin


Настройка сети
Для того, чтобы посмотреть доступные конфигурации сетей, надо сделать следующее:

stack@host:~/devstack$ nova secgroup-list
+----+---------+-------------+
| Id | Name    | Description |
+----+---------+-------------+
| 1  | default | default     |
+----+---------+-------------+


Nova — это менеджер виртуальных машин, который так же отвечает за работоспособность виртуальной сети. Вообще в DevStack можно получить одну и ту же (а точнее, разного уровня детализации) информацию от различных служб, что будет показано ниже.

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

Каждая сетевая группа состоит из правил, которые определяют поведение этой группы. Чтобы посмотреть, какие правила установлены в группе default, надо ввести команду secgroup-list-rules:

stack@host:~/devstack$ nova secgroup-list-rules default
+-------------+-----------+---------+----------+--------------+
| IP Protocol | From Port | To Port | IP Range | Source Group |
+-------------+-----------+---------+----------+--------------+
+-------------+-----------+---------+----------+--------------+


Как видим, в настоящий момент список правил пуст. В таком виде наши инстансы не смогут общаться с внешним миром. Для того, чтобы исправить ситуацию, надо добавить несколько правил, а именно:

  1. Правило для доступа по SSH
  2. Правило для протокола ICMP (обеспечивает работу команды ping)
  3. Правило для доступа интернет-трафика по протоколу http
  4. Правило для доступа интернет-трафика по протоколу https


Правила добавляются по шаблону: secgroup-add-rule .

stack@host:~/devstack$ nova secgroup-add-rule default tcp 22 22 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 22        | 22      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
stack@host:~/devstack$ nova secgroup-add-rule default icmp -1 255 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| icmp        | -1        | 255     | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
stack@host:~/devstack$ nova secgroup-add-rule default tcp 80 80 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 80        | 80      | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+
stack@host:~/devstack$ nova secgroup-add-rule default tcp 443 443 0.0.0.0/0
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 443       | 443     | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+


Проверим, что получилось:

nova secgroup-list-rules default
+-------------+-----------+---------+-----------+--------------+
| IP Protocol | From Port | To Port | IP Range  | Source Group |
+-------------+-----------+---------+-----------+--------------+
| tcp         | 22        | 22      | 0.0.0.0/0 |              |
| icmp        | -1        | 255     | 0.0.0.0/0 |              |
| tcp         | 80        | 80      | 0.0.0.0/0 |              |
| tcp         | 443       | 443     | 0.0.0.0/0 |              |
+-------------+-----------+---------+-----------+--------------+


Создание ключа SSH
Для работы с операционными системами, отличными от CirrOS, нам понадобится ключ шифрования SSH. Специально для этих целей DevStack предоставляет всю необходимую функциональность. Если ввести команду keypair-list, то мы увидим таблицу всех доступных нам ключей:

stack@host:~/devstack$ nova keypair-list
+-------+------+-------------------------------------------------+
| Name  | Type | Fingerprint                                     |
+-------+------+-------------------------------------------------+
+-------+------+-------------------------------------------------+


Сгенерировать так нужный нам ключ можно с помощью команды ssh-keygen:

$ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/stack/.ssh/id_rsa): cloud.key


После создания ключа у нас в текущей директории появятся два файла: cloud.key и cloud.key.pub. Для файла cloud.key надо сразу выставить корректные права:

$sudo chmod 600 cloud.key


Теперь надо добавить созданный ключ в список доступных:

stack@host:~/devstack$ nova keypair-add --pub-key cloud.key.pub cloud
stack@host:~/devstack$ nova keypair-list
+-------+------+-------------------------------------------------+
| Name  | Type | Fingerprint                                     |
+-------+------+-------------------------------------------------+
| cloud | ssh  | 6f:a7:c2:11:f0:e9:9c:77:43:fc:61:37:b4:e5:f9:b2 |
+-------+------+-------------------------------------------------+


Добавление образа ОС через glance
Теперь самое время посмотреть, какие операционные системы нам доступны в установке по умолчанию. Сделать это можно с помощью команды image-list:

$nova image-list
+--------------------------------------+---------------------------------+--------+--------+
| ID                                   | Name                            | Status | Server |
+--------------------------------------+---------------------------------+--------+--------+
| cc5fedc0-8331-4cfe-b2f0-27f264a81dde | cirros-0.3.4-x86_64-uec         | ACTIVE |        |
| bc0d3c78-d48b-4b41-872d-5106e3392a3c | cirros-0.3.4-x86_64-uec-kernel  | ACTIVE |        |
| 26bfbc17-1ea9-4a50-9075-5064a2b3d0ad | cirros-0.3.4-x86_64-uec-ramdisk | ACTIVE |        |
+--------------------------------------+---------------------------------+--------+--------+


Как и было сказано выше, по умолчанию нам доступна только одна операционная система. За управление доступными образами отвечает отдельный инструмент glance:

$glance image-list
+--------------------------------------+---------------------------------+
| ID                                   | Name                            |
+--------------------------------------+---------------------------------+
| cc5fedc0-8331-4cfe-b2f0-27f264a81dde | cirros-0.3.4-x86_64-uec         |
| bc0d3c78-d48b-4b41-872d-5106e3392a3c | cirros-0.3.4-x86_64-uec-kernel  |
| 26bfbc17-1ea9-4a50-9075-5064a2b3d0ad | cirros-0.3.4-x86_64-uec-ramdisk |
+--------------------------------------+---------------------------------+


Как видно, выводы команды image-list практически идентичны как у glance, так и у nova, за тем исключением, что nova предоставляет дополнительную информацию.

В качестве рабочей ОС будем использовать Ubuntu 15.10, которую можно взять с cloud-images.ubuntu.com/vivid/current. Полный список поддерживаемых ОС можно посмотреть здесь: docs.openstack.org/image-guide/obtain-images.html. Там же говорится, что в некоторых (конкретно в нашем) случае нам понадобится ключ SSH для того, чтобы залогиниться на созданный инстанс.

Сначала надо выкачать образ диска из сети:

stack@host:~/devstack$ wget https://cloud-images.ubuntu.com/vivid/current/vivid-server-cloudimg-amd64-disk1.img


После чего можно залить новый образ на сервер glance:

stack@host:~/devstack$ glance image-create --name ubuntu_vivid --visibility public --container-format ami --file vivid-server-cloudimg-amd64-disk1.img --disk-format ami


Где name — имя образа в БД, которое будет выводиться по командам nova image-list или glance image-list.Запуск инстанса
Теперь все готово к запуску нашего первого инстанса. Для этого воспользуемся командой openstack server create:

stack@host:~/devstack$ openstack server create srv1 --flavor=m1.small --image=ubuntu --key-name=cloud
+--------------------------------------+-----------------------------------------------+
| Field                                | Value                                         |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                        |
| OS-EXT-AZ:availability_zone          |                                               |
| OS-EXT-SRV-ATTR:host                 | None                                          |
| OS-EXT-SRV-ATTR:hypervisor_hostname  | None                                          |
| OS-EXT-SRV-ATTR:instance_name        | instance-00000001                             |
| OS-EXT-STS:power_state               | NOSTATE                                       |
| OS-EXT-STS:task_state                | scheduling                                    |
| OS-EXT-STS:vm_state                  | building                                      |
| OS-SRV-USG:launched_at               | None                                          |
| OS-SRV-USG:terminated_at             | None                                          |
| accessIPv4                           |                                               |
| accessIPv6                           |                                               |
| addresses                            |                                               |
| adminPass                            | SJZYQRUgoo3k                                  |
| config_drive                         |                                               |
| created                              | 2016-06-06T06:50:41Z                          |
| flavor                               | m1.small (2)                                  |
| hostId                               |                                               |
| id                                   | 706e906a-eb62-4927-afdf-e9a30b29c17f          |
| image                                | ubuntu (beb392b7-de7f-4fef-9afa-2cc5c2a38a13) |
| key_name                             | cloud                                         |
| name                                 | srv1                                          |
| os-extended-volumes:volumes_attached | []                                            |
| progress                             | 0                                             |
| project_id                           | 7784247e5055485bb43c9f3311332d9a              |
| properties                           |                                               |
| security_groups                      | [{u'name': u'default'}]                       |
| status                               | BUILD                                         |
| updated                              | 2016-06-06T06:50:41Z                          |
| user_id                              | e54b731c7e1f40f4a5ad16d64be383bd              |
+--------------------------------------+-----------------------------------------------+


Где srv1 — имя нового инстанса, m1.small — H/W конфигурация инстанса, ubuntu — имя образа, и cloud — имя пары ключей SSH во внутренней таблице DevStack.

Т.к. мы пытаемся запустить полноценную ОС, то нам надо выделить под неё соответствующие ресурсы, поэтому конфигурация m1.small является минимальной. Для инстанса с CirrOS достаточно конфигурации m1.tiny. Разницу в конфигурациях можно посмотреть командой flavor-list:

stack@host:~/devstack$ nova flavor-list
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| ID | Name      | Memory_MB | Disk | Ephemeral | Swap | VCPUs | RXTX_Factor | Is_Public |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+
| 1  | m1.tiny   | 512       | 1    | 0         |      | 1     | 1.0         | True      |
| 2  | m1.small  | 2048      | 20   | 0         |      | 1     | 1.0         | True      |
| 3  | m1.medium | 4096      | 40   | 0         |      | 2     | 1.0         | True      |
| 4  | m1.large  | 8192      | 80   | 0         |      | 4     | 1.0         | True      |
+----+-----------+-----------+------+-----------+------+-------+-------------+-----------+


Если вы устанавливали DevStack из HEAD, то возможно будут доступны дополнительные конфигурации. Наш инстанс будет готов к работе, когда его статус изменится из состояния BUILD в ACTIVE:

stack@host:~/devstack$ nova list
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | -          | Running     | private=15.0.0.2 |
+--------------------------------------+------+--------+------------+-------------+------------------+


Как видно, сейчас у нашего инстанса есть только IP-адрес из диапазона fixed-адресов. Однако, если все сделано правильно, мы можем выполнить команду ping:

stack@host:~/devstack$ ping 15.0.0.2
PING 15.0.0.2 (15.0.0.2) 56(84) bytes of data.
64 bytes from 15.0.0.2: icmp_seq=1 ttl=64 time=5.31 ms
64 bytes from 15.0.0.2: icmp_seq=2 ttl=64 time=0.470 ms
64 bytes from 15.0.0.2: icmp_seq=3 ttl=64 time=0.409 ms


И попробовать залогиниться по SSH, используя в качестве имени пользователя ubuntu (почему — написано здесь):

stack@host:~/devstack$ ssh ubuntu@15.0.0.2
The authenticity of host '15.0.0.2 (15.0.0.2)' can't be established.
ED25519 key fingerprint is 0e:56:2d:b0:d7:5f:27:bc:cd:39:ff:85:e6:84:a4:ef.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '15.0.0.2' (ED25519) to the list of known hosts.
Permission denied (publickey).


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

stack@host:~/devstack$ ssh -i cloud.key ubuntu@15.0.0.2
Welcome to Ubuntu 15.04 (GNU/Linux 4.2.0-36-generic x86_64)
…
ubuntu@srv1:~$ pwd
/home/ubuntu


Добавление Floating-IP
Посмотреть все доступные в настоящий момент floating-адреса можно так:

stack@host:~/devstack$ nova floating-ip-list
+----+----+-----------+----------+------+
| Id | IP | Server Id | Fixed IP | Pool |
+----+----+-----------+----------+------+
+----+----+-----------+----------+------+


Как и стоило ожидать, он пуст. Создадим парочку адресов:

stack@astarove-VirtualBox:~/devstack$ nova floating-ip-create
+----+----------+-----------+----------+----------+
| Id | IP       | Server Id | Fixed IP | Pool     |
+----+----------+-----------+----------+----------+
| 1  | 10.0.2.1 | -         | -        | external |
+----+----------+-----------+----------+----------+
stack@host:~/devstack$ nova floating-ip-create
+----+----------+-----------+----------+----------+
| Id | IP       | Server Id | Fixed IP | Pool     |
+----+----------+-----------+----------+----------+
| 2  | 10.0.2.2 | -         | -        | external |
+----+----------+-----------+----------+----------+
stack@host:~/devstack$ nova floating-ip-list
+----+----------+-----------+----------+----------+
| Id | IP       | Server Id | Fixed IP | Pool     |
+----+----------+-----------+----------+----------+
| 1  | 10.0.2.1 | -         | -        | external |
| 2  | 10.0.2.2 | -         | -        | external |
+----+----------+-----------+----------+----------+


И добавим один из этих адресов к нашему серверу:

stack@host:~/devstack$ nova add-floating-ip srv1 10.0.2.1
stack@host:~/devstack$ nova list            
+--------------------------------------+------+--------+------------+-------------+----------------------------+
| ID                                   | Name | Status | Task State | Power State | Networks                   |
+--------------------------------------+------+--------+------------+-------------+----------------------------+
| 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | -          | Running     | private=15.0.0.2, 10.0.2.1 |
+--------------------------------------+------+--------+------------+-------------+----------------------------+


Как видим, у инстанса srv1 появился дополнительный адрес, по которому так же можно выполнить команды ping и ssh (для нового IP потребуется создать новый ключ):

stack@host:~/devstack$ ping 10.0.2.1
PING 10.0.2.1 (10.0.2.1) 56(84) bytes of data.
64 bytes from 10.0.2.1: icmp_seq=1 ttl=64 time=1.86 ms
64 bytes from 10.0.2.1: icmp_seq=2 ttl=64 time=0.410 ms
^C
--- 10.0.2.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.410/1.136/1.863/0.727 ms
stack@host:~/devstack$ ssh -i cloud.key ubuntu@10.0.2.1
The authenticity of host '10.0.2.1 (10.0.2.1)' can't be established.
ED25519 key fingerprint is 0e:56:2d:b0:d7:5f:27:bc:cd:39:ff:85:e6:84:a4:ef.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.2.1' (ED25519) to the list of known hosts.
…
ubuntu@srv1:~$


Чтобы удалить floating-ip у инстанса, надо выполнить команду remove-floating-ip (при этом сам IP остается в списке доступных floating-адресов):

stack@host:~/devstack$ nova remove-floating-ip srv1 10.0.2.1
stack@host:~/devstack$ nova list
+--------------------------------------+------+--------+------------+-------------+------------------+
| ID                                   | Name | Status | Task State | Power State | Networks         |
+--------------------------------------+------+--------+------------+-------------+------------------+
| 706e906a-eb62-4927-afdf-e9a30b29c17f | srv1 | ACTIVE | -          | Running     | private=15.0.0.2 |
+--------------------------------------+------+--------+------------+-------------+------------------+


Заключение


В статье подробно рассмотрен процесс установки, настройки и запуска виртуальных машин (инстансов) с использованием пакета виртуализации DevStack. Были рассмотрены основные команды, используемые при работе с DevStack из CLI. Стоит сказать, что практически все шаги, описанные в статье, можно выполнить через графический интерфейс, называемый neutron. Спасибо за комментарии и удачи!

На заметку


Повторный запуск DevStack после перезагрузки системы. Сначала удалим все, что относилось к предыдущей сессии:

stack@host:~/devstack$ ./unstack.sh
stack@host:~/devstack$ ./clean.sh


включая то, что обычно не удаляется:

stack@host:~/devstack$ sudo rm -rf /opt/stack/*


После чего перезапускаем DevStack:

stack@host:~/devstack$ ./stack.sh


Возможные проблемы
Симптом
При попытке запустить команду из-под sudo появляется сообщение:

sudo: unable to resolve host


Возможное решение
Выполнить команду:

cat /etc/hostname


Результат скопировать в файл /etc/hosts в первую строку:

nano /etc/hosts


Удаление сохраненных ключей
Симптом

stack@host:~/devstack$ ssh -i cloud.key ubuntu@15.0.0.3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
c9:8e:70:27:1d:3b:c8:9c:b3:db:df:c2:a4:07:92:a1.
Please contact your system administrator.
Add correct host key in /home/stack/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /home/stack/.ssh/known_hosts:2
  remove with: ssh-keygen -f "/home/stack/.ssh/known_hosts" -R 15.0.0.3
ED25519 host key for 15.0.0.3 has changed and you have requested strict checking.
Host key verification failed.


Возможное решение
Как вариант удалить файл /home/stack/.ssh/known_hosts:

stack@host:~/devstack$ sudo rm /home/stack/.ssh/known_hosts

© Habrahabr.ru