Для улучшения работы сайта мы используем файлы cookies. Оставаясь на сайте, вы соглашаетесь с политикой обработки персональных данных.

Развертывание продукта с использованием AWX

Для создания и развертывания собственного продукта используется программное обеспечение централизованного управления плейбуками — AWX. В качестве целевого продукта выбрана система управления секретами — Vault.

Настоящая инструкция описывает процесс развертывания системы Vault с использованием Конструктора Cloudlink и AWX.

1. Создание шаблона в AWX

  1. Для подключения перейдите по ссылке https://awx.FQDN_Cloudlink/

  2. Перейдите во вкладку Templates и нажмите Add.

  3. Выберите Add job template.

    a0
  4. Укажите следующие параметры нового Job template

    • Name — название шаблона, будет использовано в графе продукта и должно быть уникальным.

    • Job Type — тип шаблона указать RUN

    • Project —  название git-репозитория.

    • Playbook — наименование плейбука, который будет запускать развертывание продукта

      a1

      Репозиторий с плейбуками может быть размещен во встроенном инструменте Gitea или подключен извне.

      Для добавления репозитория перейдите в AWX → откройте вкладку Projects →нажмите Add.

      a2

      Укажите название (Name), организацию (Organization), тип источника (Source Control Type), URL источника (Source Control URL), название ветки репозитория (Source Control Branch) и учетные данные для подключения(Source control credential).

      a3

2. Создание плейбука (Playbook)

Рассмотрим на примере плейбука для развертывания продукта Vault. Основным файлом для исполнения является файл hashicorp-vault.yaml, указанный в параметре Playbook для шаблона в AWX.

В данном случае данный файл содержит описание ролей, которые будут исполняться:

b1
  • Роль configure-load-vars — импортирует параметры для подключения к средам исполнения продукта, которые заданы в виде Credentials в AWX.

    b3
  • Роль hashicorp-vault — собирает информацию о типе операционной системы (т.е. на базе Debian или RHEL), на базе которой необходимо развернуть Vault. В зависимости от этой ОС роль hashicorp-vault запускает задачи по разворачиванию.

    Например если при заказе продукта на базе ОС Alma будет запущена задача task rhel.yaml, в результате выполнения которой будет устанавливает пакет Vault при помощи пакетного менеджера dnf из подключенного репозитория.

    В результате выполнения плейбука необходимо вывести параметры для подключения к развернутому экземпляру Vault - токен, ключ и URL.

    Рекомендуется использовать модуль set_stats`.

    b4

    Полученные параметры будут использованы в графе.

Перед созданием любого продукта автоматически выполняется плейбук fist-logon.yml. Он содержит следующие роли:

  • configure-load-vars — импортирует переменные для подключения к средам исполнения продукта, которые заданы в виде Credentials в AWX

  • configure-first-logon — проверяет доступность среды для развертывания продукта и добавляет ключи для доступа к виртуальной машине с продуктом.

  • configure-repositories — настраивает доступ к репозиторию с пакетами для установки, по умолчанию используется встроенный на базе Nexus. При необходимости можно добавить внешний репозиторий.

  • configure-ntp — настраивает NTP-сервер.

  • linux_disk — создает дополнительные диски при указании в заказе продукта точки монтирования.

    b2

Разместите пакеты для установки в репозиторий.

+ В качестве встроенного репозитория для пакетов используется Nexus.

Структура графа для сценария с продуктом Vault включает в себя 6 узлов, которые используют встроенные шаблоны или подграфы:

  1. Узел Создание ВМ — создает виртуальную машину, на базе которой будет развернут продукт Vault.

  2. Узел Создание UUID — генерирует уникальный идентификатор item.

  3. Узел Создание Inventory — получает параметры.

  4. Узел Настройка ВМ — выполняет плейбуки по развертыванию Vault на виртуальной машине.

  5. Узел Создание item приложения — генерирует уникальный идентификатор item.

  6. Узел Создание связи parent-child — создает формы отображения заказа.

В примере с Vault в форме будет отображаться: версия Vault, точка подключения, а также Root Token и Unseal Keys развёрнутого Vault.

awx constructor graph overview

3.1. Ввод основных данных графа

  1. В Control Panel Cloudlink перейдите в КонструкторГрафы и нажмите +.

  2. Во вкладке Общая информация введите следующие параметры:

    • Код графа — уникальный символьный идентификатор продукта. Он может содержать только прописные латинские символы, цифры, нижнее подчеркивание,тире двоеточие и точку.

    • Наименование — символьное название продукта.

    • Тип — выберите creating.

    • Описание(опционально) — укажите отличительную особенность продукта.

    • Автор — введите имя или инициалы автора продукта.

      Код графа,наименование и автор необходимы для идентификации и управления графом в системе.
    • При необходимости активируйте опции, отрабатывающие в случае некорректного проигрывания графа: Переводить заказ в статус Ошибка и Блокировать заказ при ошибке.

      awx constructor graph create

3.2. Создание узлов графа

Добавьте узлы в граф:

  1. Для этого перейдите во вкладку Узлы и нажмите кнопку +.

  2. Создайте первый узел:

    1. Введите основные свойства:

      • Название — create_vm

      • Описание — Создание ВМ

      • Подграф — выберите create_vm_general

        awx constructor graph node 1
    2. Во вкладке Параметры:

      • В блоке Static Data введите статические данные.

        Данные из блока Static data можно использовать во всем графе, их достаточно указать единожды.

        В примере с Vault в качестве статических данных указаны:

        {
          "tenant": {},
          "ssh_keys": [],
          "extra_nics": [],
          "vault_port": "8200",
          "credentials": [
            "Cloud",
            "nexus"
          ],
          "extra_disks": [],
          "job_template": "hashicorp-vault",
          "business_line": "general",
          "vault_version": "1.15.5",
          "os_local_users": [],
          "ntp_server_data": {
            "host": "",
            "port": ""
          },
          "inventory_status": "native",
          "uuidgen_template": "{{ uuidgen() }}",
          "inventory_template": "{% set inventory = {'all': {'hosts': {}, 'vars': {'vault_port': vault_port, 'vault_version': vault_version}}} %}{% set _ = inventory.all.hosts.update({item_config.hostname: {'ansible_host': item_config.default_v4_address, 'machine': item_config}}) %}{% set _ = inventory.all.vars.update({}) %}{{ inventory | tojson }}"
        }

        Описание дополнительных переменных для Vault:

        • vault_port — порт в этом примере используется для WEB UI Vault.

        • vault_version — параметр используется при загрузке Vault из локального репозитория.

        • inventory_template — в шаблоне Jinja указаны параметры 'vars': {'vault_port': vault_port, 'vault_version': vault_version}. Они будут сохранены во временном инвентарном файле при запуске Job

      • В блоке Input в качестве входящий данных укажите:

        {
         "name": "name",
          "image": "image",
          "flavor": "flavor",
          "is_code": "is_code",
          "platform": "platform",
          "ssh_keys": "ssh_keys",
          "boot_disk": "boot_disk",
          "data_center": "data_center",
          "default_nic": "default_nic",
          "extra_disks": "extra_disks",
          "extra_mounts": "extra_mounts",
          "business_line": "business_line",
          "resource_pool": "resource_pool",
          "ntp_server_url": "ntp_server_data['host']",
          "os_local_users": "os_local_users",
          "environment_type": "environment_type"
        }
      • В блоке Output в качестве исходящий данных укажите:

        {
          "item_id": "item_id",
          "item_config": "item_config"
        }
    3. Нажмите Добавить, чтобы завершить создание первого узла.

      awx constructor graph node 2
  3. Во вкладке Узлы нажмите кнопку + и создайте второй узел:

    1. Введите основные свойства:

      • Название — ge_uuid

      • Описание — Создание UUID

      • Шаблон — выберите jinja2_format

        awx constructor graph node 3
    2. Во вкладке Параметры:

      • В блоке Static Data данные наследуются из первого узла в графе.

      • В блоке Input в качестве входящий данных укажите:

        {"template": "uuidgen_template"}
      • В блоке Output в качестве исходящий данных укажите:

        {"formatted": "app_uuid"}
    3. Нажмите Добавить, чтобы завершить создание второго узла.

      awx constructor graph node 4
  4. Во вкладке Узлы нажмите кнопку + и создайте третий узел:

    1. Введите основные свойства:

      • Название — make_inventory

      • Описание — Создание Inventory

      • Шаблон — выберите jinja2_format

        awx constructor graph node 5
    2. Во вкладке Параметры:

      • В блоке Static Data данные наследуются из первого узла в графе.

      • В блоке Input в качестве входящий данных укажите:

        {
          "item_id": "item_id",
          "template": "inventory_template",
          "from_json": "True",
          "vault_port": "vault_port",
          "item_config": "item_config",
          "vault_version": "vault_version"
        }

        В этом узле графа мы не указываем значения vault_port и vault_version, а указываем названия самих переменных, так как ранее версия и порт были указаны в статичных данных.

      • В блоке Output в качестве исходящий данных укажите:

        {
          "formatted": "inventory"
        }
    3. Нажмите Добавить, чтобы завершить создание третьего узла.

      awx constructor graph node 6
  5. Во вкладке Узлы нажмите кнопку + и создайте четвертый узел:

    1. Введите основные свойства:

      • Название — configuration_vm

      • Описание — Настройка ВМ

      • Шаблон — выберите ansible_awx

        awx constructor graph node 7
    2. Во вкладке Параметры:

      • В блоке Static Data данные наследуются из первого узла в графе.

      • В блоке Input в качестве входящий данных укажите:

        {
          "inventory": "inventory",
          "extra_vars": "{'environment_type':environment_type}",
          "vault_port": "vault_port",
          "credentials": "credentials",
          "net_segment": "environment_type",
          "job_template": "job_template",
          "vault_version": "vault_version",
          "environment_type": "environment_type"
        }
      • В блоке Output в качестве исходящий данных укажите:

        {
          "vault_keys": "vault_keys",
          "vault_token": "vault_token",
          "connection_url": "connection_url"
        }

        Исходящие данные должны совпадать с артефактами запуска Playbook. Для того чтобы в результате запуска Playbook в AWX остались артефакты, в роли необходимо использовать модуль set_stats. В примере с Vault модуль используется следующим образом:

        - set_stats:
            data:
              vault_token: "{{ vault_init_result.json.root_token }}"
              vault_keys: "{{ vault_init_result.json.keys_base64 }}"
              connection_url: "{{ 'http://' + ansible_host | string + ':' + vault_port | string }}"

        В данном модуле в качестве артефактов root_token устанавливаются Vault и unseal_keys, а также указываем составной connection_url. Ключи артефактов (stats), которые вы указываете, должны совпадать с исходящими данными узла графа.

    3. Нажмите Добавить, чтобы завершить создание четвертого узла.

      awx constructor graph node 8
  6. Во вкладке Узлы нажмите кнопку + и создайте пятый узел:

    1. Введите основные свойства:

      • Название - create_app_item

      • Описание - Создание item приложения

      • Подграф - create_item_box

        awx constructor graph node 9
    2. Во вкладке Параметры:

      • В блоке Static Data данные наследуются из первого узла в графе.

      • В блоке Input в качестве входящий данных укажите:

        {
          "type": "enums.EventType.APP.value",
          "config": "{'connection_url': connection_url, 'vault_version': vault_version, 'vault_token': vault_token, 'vault_keys': vault_keys}",
          "status": "enums.EventState.ON.value",
          "item_id": "app_uuid",
          "provider": "enums.EventProvider.HASHICORP_VAULT.value",
          "environment_type": "environment_type",
          "inventory_status": "inventory_status"
        }

        Пояснение к полям:

        • config — параметры конфигурации, которые используются для настройки отображения продукта.

          Здесь нужно указать:

          • connection_url — URL подключения,

          • vault_version — версию Vault,

          • vault_token — токен для доступа,

          • vault_keys — ключи Vault.

            Эти значения берутся из ранее созданных узлов.

        • status — текущее состояние события. Значение ON означает, что событие активно.

        • item_id — идентификатор элемента (в данном случае — UUID приложения).

        • provider — провайдер, связанный с этим событием. Укажите провайдера, который был ранее создан в разделе Конструктор → Справочник. Например: "HASHICORP_VAULT".

      • В блоке Output исходящие параметры не заполняются.

    3. Нажмите Добавить, чтобы завершить создание пятого узла.

      awx constructor graph node 10
  7. Во вкладке Узлы нажмите кнопку + и создайте шестой узел:

    1. Введите основные свойства:

      • Название — create_parent_chain

      • Описание — Создание связи parent-child

      • Шаблон — add_event

        awx constructor graph node 11
    2. Во вкладке Параметры:

      • В блоке Static Data данные наследуются из первого узла в графе.

      • В блоке Input в качестве входящий данных укажите::

        {
          "type": "enums.EventType.VM.value",
          "status": "app_uuid",
          "item_id": "item_id",
          "subtype": "enums.EventSubType.PARENT.value"
        }
      • В блоке Output исходящие параметры не заполняются.

    3. Нажмите Добавить, чтобы завершить создание шестого узла.

      awx constructor graph node 12
  8. Нажмите Сохранить, чтобы сохранить граф.

4. Создание шаблона отображения

  1. Перейдите в раздел Конструктор → Шаблоны отображения.

  2. Нажмите кнопку +.

  3. Во вкладке Основное укажите следующие параметры:

    • Наименование — введите название создаваемого шаблона. Это значение будет отображаться в списке шаблонов.

    • Код шаблона — задайте уникальный символьный идентификатор шаблона. Может содержать только строчные латинские буквы, цифры, символы дефиса (-) и подчёркивания (_).

    • Описание (опционально) — добавьте краткое описание шаблона.

    • Состояние — переключатель активности шаблона.

      • Если включено, шаблон доступен для использования в системе.

      • Если выключено, шаблон не отображается в системе.

    • Тип — выберите тип шаблона из списка. Например, app.

    • Провайдер — укажите провайдера, с которым связан шаблон.

      Наименование, Код шаблона и Провайдер необходимы для идентификации и корректного отображения шаблона в системе.
      constructor display patterns vault 1
  4. Перейдите во вкладку Полное отображение и опишите шаблон отображения вкладок, меток и других элементов в формате JSON.

  5. Нажмите Сохранить.

    constructor display patterns vault 2

Вы можете предварительно просмотреть отображение описанного шаблона для приложения, нажав на кнопку Просмотр.

constructor display patterns vault 3