Heat openstack в примерах

Для дальнейшего удобства ставим алиас:

echo -e "alias os='openstack'" >> ~/.bashrc; source ~/.bashrc

Далее везде в примерах вместо ‘openstack’ пишем ‘os’.

Пример 01. Создать простую ВМ

Смотрим, какие стеки есть в системе:

os heat list
+--------------------------------------+------------+----------------------------------+-----------------+----------------------+--------------+
| ID                                   | Stack Name | Project                          | Stack Status    | Creation Time        | Updated Time |
+--------------------------------------+------------+----------------------------------+-----------------+----------------------+--------------+
| 6876a334-514b-48b8-b524-bec41ba72ad7 | exanple    | a18041366a4248039a746220c43f479e | CREATE_COMPLETE | 2020-02-21T10:32:18Z | None         |
| ce99e8b0-52fa-4ff0-8f4c-cb5790a7f75b | s11        | ef81be5a4bec40ec85e6d7220583a3e6 | CHECK_COMPLETE  | 2019-10-29T12:14:45Z | None         |
+--------------------------------------+------------+----------------------------------+-----------------+----------------------+--------------+

Переключим проект:

source ../env/otr.env

Находим идентификатор сети provider и записываем его в переменную NET_ID

export NET_ID=$(openstack network list | awk '/ provider / { print $2 }')

Посмотрим, какие версии шаблонов поддерживаются в нашей системе:

openstack orchestration template version list
+--------------------------------------+------+------------------------------+
| Version                              | Type | Aliases                      |
+--------------------------------------+------+------------------------------+
| AWSTemplateFormatVersion.2010-09-09  | cfn  |                              |
| HeatTemplateFormatVersion.2012-12-12 | cfn  |                              |
| heat_template_version.2013-05-23     | hot  |                              |
| heat_template_version.2014-10-16     | hot  |                              |
| heat_template_version.2015-04-30     | hot  |                              |
| heat_template_version.2015-10-15     | hot  |                              |
| heat_template_version.2016-04-08     | hot  |                              |
| heat_template_version.2016-10-14     | hot  | heat_template_version.newton |
| heat_template_version.2017-02-24     | hot  | heat_template_version.ocata  |
| heat_template_version.2017-09-01     | hot  | heat_template_version.pike   |
+--------------------------------------+------+------------------------------+

Создаем шаблон демо-стека 01_vm-add.ymll:

heat_template_version: 2017-09-01
description: Launch a basic instance with CirrOS image using the
             ``m1.tiny`` flavor, ``mykey`` key,  and one network.

parameters:
  NetID:
    type: string
    description: Network ID to use for the instance.

resources:
  server:
    type: OS::Nova::Server
    properties:
      image: cirros-rebs
      flavor: m1.nano
      key_name: omega
      networks:
      - network: { get_param: NetID }

outputs:
  instance_name:
    description: Name of the instance.
    value: { get_attr: [ server, name ] }
  instance_ip:
    description: IP address of the instance.
    value: { get_attr: [ server, first_address ] }

В первой строке ставим свежую подходящую версию.

Создаем стек:

openstack stack create -t 01_vm-add.yml --parameter "NetID=$NET_ID" demo1
+---------------------+----------------------------------------------------------------------------------------------------------+
| Field               | Value                                                                                                    |
+---------------------+----------------------------------------------------------------------------------------------------------+
| id                  | 8e82a9f6-56a9-4066-8897-053011706817                                                                     |
| stack_name          | demo1                                                                                                    |
| description         | Launch a basic instance with CirrOS image using the ``m1.tiny`` flavor, ``mykey`` key,  and one network. |
| creation_time       | 2021-02-02T12:50:58Z                                                                                     |
| updated_time        | None                                                                                                     |
| stack_status        | CREATE_IN_PROGRESS                                                                                       |
| stack_status_reason | Stack CREATE started                                                                                     |
+---------------------+----------------------------------------------------------------------------------------------------------+

Смотрим параметры созданного стека:

$ os stack show demo1
+-----------------------+----------------------------------------------------------------------------------------------------------------------+
| Field                 | Value                                                                                                                |
+-----------------------+----------------------------------------------------------------------------------------------------------------------+
| id                    | 8e82a9f6-56a9-4066-8897-053011706817                                                                                 |
| stack_name            | demo1                                                                                                                |
| description           | Launch a basic instance with CirrOS image              |
| creation_time         | 2021-02-02T12:50:58Z                                                                                                 |
| updated_time          | None                                                                                                                 |
| stack_status          | CREATE_COMPLETE                                                                                                      |
| stack_status_reason   | Stack CREATE completed successfully                                                                                  |
| parameters            | NetID: d68873fd-42c1-4688-a209-aa876f73d1b2                                                                          |
|                       | OS::project_id: e26e6a43abaa454aaec4c02e58372910                                                                     |
|                       | OS::stack_id: 8e82a9f6-56a9-4066-8897-053011706817                                                                   |
|                       | OS::stack_name: demo1                                                                                                |
|                       |                                                                                                                      |
| outputs               | - description: Name of the instance.                                                                                 |
|                       |   output_key: instance_name                                                                                          |
|                       |   output_value: demo1-server-icfjuqyy2kqg                                                                            |
|                       | - description: IP address of the instance.                                                                           |
|                       |   output_key: instance_ip                                                                                            |
|                       |   output_value: 10.0.4.208                                                                                           |
|                       |                                                                                                                      |
| links                 | - href: http://10.0.4.190:8004/v1/e26e6a43abaa454aaec4c02e58372910/stacks/demo1/8e82a9f6-56a9-4066-8897-053011706817 |
|                       |   rel: self                                                                                                          |
|                       |                                                                                                                      |
| parent                | None                                                                                                                 |
| disable_rollback      | True                                                                                                                 |
| deletion_time         | None                                                                                                                 |
| stack_user_project_id | fc7d90baf9b54efeafd0b1f827b82300                                                                                     |
| capabilities          | []                                                                                                                   |
| notification_topics   | []                                                                                                                   |
| stack_owner           | None                                                                                                                 |
| timeout_mins          | None                                                                                                                 |
| tags                  | None                                                                                                                 |
+-----------------------+----------------------------------------------------------------------------------------------------------------------+

Удаляем стек

os stack delete

Пример 2. Создать проект

Переключаем авторизацию на админскую

source ~/env/admin-openrc

Смотрим параметры ресурса OS::Keystone::Project здесь https://documentation.suse.com/external-tree/en-us/soc/9/openstack/admin/html/heat/template_guide/openstack.html#OS::Keystone::Project

Создаем файл YAML-шаблона 02_proj-add.yml

heat_template_version: 2017-09-01
description: New project create

parameters:
  ProjName:
    type: string
    description: Project name

resources:
  project:
    type: OS::Keystone::Project
    properties:
      description: REU im.Plekhanov Labaratory
      enabled: true
      name: { get_param: ProjName }

Запускаем создание стека:

os stack create -t 2_proj-add.yml --parameter "ProjName=reu" reu

Пошло создание стека:

+---------------------+--------------------------------------+
| Field               | Value                                |
+---------------------+--------------------------------------+
| id                  | 3539aca2-42c9-4d40-b443-680b9d07c851 |
| stack_name          | reu                                  |
| description         | New project create                   |
| creation_time       | 2021-02-02T14:02:51Z                 |
| updated_time        | None                                 |
| stack_status        | CREATE_IN_PROGRESS                   |
| stack_status_reason | Stack CREATE started                 |
+---------------------+--------------------------------------+

Проверим, что проект создан:

os project list | grep reu
| b52fb5585c60497f9a839c829920ebca | reu            |

Пример 3. Добавить пользователя в проект

Для начала посмотрим параметры стека:

openstack stack environment show 3539aca2-42c9-4d40-b443-680b9d07c851
parameters:
  ProjName: reu
resource_registry:
  resources: {}
parameter_defaults: {}

Здесь мы видим, что кроме имени проекта (reu) ничего нет.

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

Делам новый template 03_usr-add-proj.yml

heat_template_version: 2017-09-01
description: Assign user roles to project

parameters:
  UserName:
    type: string
    description: Username

  ProjName:
    type: string
    description: Project Name

resources:
  project:
    type: OS::Keystone::UserRoleAssignment
    properties:
      user: { get_param: UserName }
      #roles: [{"project": reu, "domain": omega, "role": admin}]
      #roles: [{"project": 085c69cc2d8741d7822e4eb0e899c5eb, "domain": dd168ad9098c42628fd65ff387d384b9, "role": admin}]
      roles: [ { "project": {get_param: ProjName}, "role": admin } ]

outputs:
  project_name:
    description: Name of the project
    value: { get_attr: [ project ] }

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

Еще важный момент - нельзя одновременно задавать и project, и domain - некорректные строки закомментированы.

openstack stack update -t 03_usr-add-proj.yml --parameter="UserName=sani" --parameter="ProjName=reu" reu2

Пример 4. Создать сеть и роутер.

Источники по теме

  1. Как запустить сценарий heat: https://docs.openstack.org/heat/pike/install/launch-instance.html

  2. Документация heat: https://docs.openstack.org/heat/pike/

  3. Список функций pike heat: https://docs.openstack.org/heat/pike/template_guide/hot_spec.html#pike
  4. Template guide: https://documentation.suse.com/external-tree/en-us/soc/9/openstack/admin/html/heat/template_guide/

02.02.2021