08 июня 2015

Знакомство с простейшим HOT шаблоном сервиса оркестрации OpenStack


Службы Heat позволяют автоматизировать управление жизненным циклом наборов облачных сервисов (виртуальными машинами, сетями, томами, группами безопасности и т.д.) как единым целым, объединяя их в так называемые стеки (stack). Задачи могут быть как простыми, например развертывание виртуальной машины, таки и более сложными, например старт комплексного приложения из многих машин и его масштабирование в зависимости от информации передаваемой модулем телеметрии. Для описания стеков используются специальные, одновременно легко читаемые человеком и дружественные к обработке машиной форматы описания ресурсов, их ограничений, зависимостей и параметров:
  • HOT (Heat Orchestration Template) — формат предназначенный исключительно для OpenStack. Представляет собой документ формата YAML. Призван заменить собой CFN — шаблоны и именно с ним мы и будем работать.
  • CFТ (AWS CloudFormation) — Документ формата JSON в формате совместимом с шаблонами сервиса CloudFormation (http://aws.amazon.com/ru/cloudformation/). Наличие возможности работать с этим типом форматов позволяет использовать множество уже существующих для AWS шаблонов.
Рассмотрим простейший шаблон:

     1 heat_template_version: 2014-10-16 
     2 description: > 
     3   OpenStack. Практическое
знакомство с облачной операционной
системой. 
     4   Пример запуска одной ВМ 
     5  
     6 parameters: 
     7   network: 
     8     type: string 
     9     description: Сеть экземпляра ВМ 
    10     default: demo-net 
    11   image: 
    12     type: string 
    13     description: Образ для
запуска ВМ 
    14     default: cirros-0.3.3-x86_64 
    15  
    16 resources: 
    17   my_server: 
    18     type: OS::Nova::Server 
    19     properties: 
    20       flavor: m2.tiny 
    21       key_name: demokey1 
    22       networks: 
    23       - network: { get_param: network } 
    24       image: { get_param: image } 
    25       user_data: | 
    26         #!/bin/sh 
    27         echo "Instance STARTED!"
    28       user_data_format: RAW 
    29  
    30 outputs: 
    31   instance_name: 
    32     description: Имя экземпляра ВМ 
    33     value: { get_attr: [my_server, name] } 
    34   private_ip: 
    35     description: IP-адрес ВМ в частной сети 
    36     value: { get_attr: [ my_server,first_address ] }

    Данный шаблон является одной из многих вариаций «Hello, World!» для Heat. Создается стек состоящий из одной виртуальной машины, которой во время старта передается скрипт,  выводящий сообщение «Instance STARTED!» на стандартный вывод. Прежде чем запустить стек, рассмотрим листинг.
    Строки с первой по четвертую — это заголовок шаблона и описание. Дата в версии heat_template_version выберется не произвольно, а задается одним из следующих вариантов,  соответствующих релизу OpenStack:
  • 2013-05-23 — Icehouse
  • 2014-10-16 — Juno
  • 2015-03-30 — Kilo
Описание опционально и если оно не помещается в одну строку, то как в примере разбивается на несколько строк в соответствии со спецификацией YAML.
    Далее следуют три секции, первая из которых parameters начинается с шестой строки. В данной части шаблона определяются параметры network и image которые можно задать во время запуска стека. Оба параметра имеют тип — строка. У каждого из параметров есть значения по умолчанию, используемые если во время запуска стека их не задали — это строки десятая и четырнадцатая. В шаблоне мог также могла быть секция parameter_groups в которой задавалось бы как параметры должны быть сгруппированы и их порядок, но в этом шаблоне секция отсутствует.
    Следующая секция  resources которая описывает ресурсы шаблона. В этой секции должен быть описан как минимум один ресурс. В данном случае как раз и описан один ресурс с именем  my_server типа  OS::Nova::Server. В подсекции  properties определены параметры сервера которые мы обычно задаем командой nova boot. Три из них, а именно размер виртуальной машины (flavor), имя открытого SSH-ключа и скрипт, который будет исполнен при старте при помощи cloud-init жестко заданны в теле шаблона. Еще два параметра, которые ранее были описаны в секции  parameters подставляются при помощи функции  get_param.
    Наконец, третья секция  outputs, которая также опциональна задает параметры которые будут выводится пользователю когда шаблон отработает в выводе  heat stack-show или в интерфейсе Horizon.
    Теперь когда мы разобрали шаблон, попробуем его запустить командой  heat stack-create. Нам нужно указать путь к файлу шаблона и по желанию после опции -P параметры которые были определены в секции  parameters. По желанию, потому что в шаблоне для них заданы значения по умолчанию.

$ source keystonerc_demo
$ heat stack-create -f test-server.yml -P network=demo-net teststack
+------+------------+--------------------+----------------------+
| id   | stack_name | stack_status       | creation_time        |
+------+------------+--------------------+----------------------+
| 08.. | teststack  | CREATE_IN_PROGRESS | 2015-06-06T20:03:19Z |
+------+------------+--------------------+----------------------+


    При помощи следующей команды мы можем следить за процессом отработки стека, дождавшись пока статус не поменяется на  CREATE_COMPLETE:

$ heat stack-list
+------+------------+-----------------+----------------------+
| id   | stack_name | stack_status    | creation_time        |
+------+------------+-----------------+----------------------+
| 08.. | teststack  | CREATE_COMPLETE | 2015-06-06T20:03:19Z |
+------+------------+-----------------+----------------------+


    Проверим что у нас действительно была создана виртуальная машина. При этом обратите внимание что ее имя было сформировано из имени стека и имени ресурса:

$ nova list
+------+--------------------------+--------+------------+-------------+----------------------+
| ID   | Name                     | Status | Task State | Power State | Networks             |
+------+--------------------------+--------+------------+-------------+----------------------+
| f8.. | teststack-my_server-hv.. | ACTIVE | -          | Running     | demo-net=172.16.0.30 |
+------+--------------------------+--------+------------+-------------+----------------------+


    Команда  heat stack-show вместе с именем стека покажет его детали, включая параметры которые попросили вывести в секции   outputs. Будут показаны  имя экземпляра виртуальной машины и  IP-адрес виртуальной машины в сети demo-net:

$ heat stack-show teststack
+----------------------+---------------------------------------------------+
| Property             |  Value                                            |
+----------------------+---------------------------------------------------+
| capabilities         | []                                                |
| creation_time        | 2015-06-06T20:03:19Z                              |
| description          | OpenStack. Практическое знакомство с облачной     |
|                      | операционной системой. Пример запуска одной ВМ    |
| disable_rollback     | True                                              |
| id                   | 08065001-1c81-4481-bc4f-0e7d2799f27c              |
| links                | http://os1.test.local:8004/v1/9c1c71f2c0f243b7a.. |
| notification_topics  | []                                                |
| outputs              | [                                                 |
|                      |   {                                               |
|                      |     "output_value": "teststack-my_server-hvio..", |
|                      |     "description": "Имя экземпляра ВМ",           |
|                      |     "output_key": "instance_name"                 |
|                      |   },                                              |
|                      |   {                                               |
|                      |     "output_value": "172.16.0.30",                |
|                      |     "description": "IP-адрес ВМ в частной сети",  |
|                      |     "output_key": "private_ip"                    |
|                      |   }                                               |
|                      | ]                                                 |
| parameters           | {                                                 |
|                      |   "image": "cirros-0.3.3-x86_64",                 |
|                      |   "OS::stack_id": "08065001-1c81-4481-bc4f-0e..", |
|                      |   "OS::stack_name": "teststack",                  |
|                      |   "network": "demo-net"                           |
|                      | }                                                 |
| parent               | None                                              |
| stack_name           | teststack                                         |
| stack_owner          | demo                                              |
| stack_status         | CREATE_COMPLETE                                   |
| stack_status_reason  | Stack CREATE completed successfully               |
| template_description | OpenStack. Практическое знакомство с облачной     |
|                      | операционной системой. Пример запуска одной ВМ    |
| timeout_mins         | None                                              |
| updated_time         | None                                              |
+----------------------+---------------------------------------------------+


    Для того, чтобы убедится что скрипт, выводящий сообщение через cloud-init сработал можно либо подключится к консоли виртуальной машине в Horizon, либо ввести команду nova, которая показывает вывод консоли:

$ nova console-log teststack-my_server-hvio4ophfajb

4 комментария:

Thero Layfer комментирует...

кажется грамотнее оркестровка а не оркестрация..

Andrey Markelov комментирует...

Возможно с точки зрения русского языка это не грамотно, но в "оркестрация" уже устоялось в ИТ. Проверил как переводят VMware, MS и EMC на своих .ru сайтах. Тоже "оркестрация", так что оставлю как есть.

Alexander Sitnik комментирует...

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

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

Да, и я согласен с Thero Layfer по поводу перевода слова.

Andrey Markelov комментирует...

Ну вот с текущей темой оформления думаю лучше...