Развертывание продукта с использованием AWX
Для создания и развертывания собственного продукта используется программное обеспечение централизованного управления плейбуками — AWX. В качестве целевого продукта выбрана система управления секретами — Vault.
Настоящая инструкция описывает процесс развертывания системы Vault с использованием Конструктора Cloudlink и AWX.
1. Создание шаблона в AWX
-
Для подключения перейдите по ссылке https://awx.FQDN_Cloudlink/
-
Перейдите во вкладку Templates и нажмите Add.
-
Выберите Add job template.
-
Укажите следующие параметры нового Job template
-
Name — название шаблона, будет использовано в графе продукта и должно быть уникальным.
-
Job Type — тип шаблона указать RUN
-
Project — название git-репозитория.
-
Playbook — наименование плейбука, который будет запускать развертывание продукта
Репозиторий с плейбуками может быть размещен во встроенном инструменте Gitea или подключен извне.
Для добавления репозитория перейдите в AWX → откройте вкладку Projects →нажмите Add.
Укажите название (Name), организацию (Organization), тип источника (Source Control Type), URL источника (Source Control URL), название ветки репозитория (Source Control Branch) и учетные данные для подключения(Source control credential).
-
2. Создание плейбука (Playbook)
Рассмотрим на примере плейбука для развертывания продукта Vault.
Основным файлом для исполнения является файл hashicorp-vault.yaml, указанный в параметре Playbook для шаблона в AWX.
В данном случае данный файл содержит описание ролей, которые будут исполняться:
-
Роль configure-load-vars — импортирует параметры для подключения к средам исполнения продукта, которые заданы в виде Credentials в AWX.
-
Роль hashicorp-vault — собирает информацию о типе операционной системы (т.е. на базе Debian или RHEL), на базе которой необходимо развернуть Vault. В зависимости от этой ОС роль hashicorp-vault запускает задачи по разворачиванию.
Например если при заказе продукта на базе ОС Alma будет запущена задача task rhel.yaml, в результате выполнения которой будет устанавливает пакет Vault при помощи пакетного менеджера dnf из подключенного репозитория.
В результате выполнения плейбука необходимо вывести параметры для подключения к развернутому экземпляру Vault - токен, ключ и URL.
Рекомендуется использовать модуль
set_stats`.
Полученные параметры будут использованы в графе.
Перед созданием любого продукта автоматически выполняется плейбук fist-logon.yml. Он содержит следующие роли:
-
configure-load-vars — импортирует переменные для подключения к средам исполнения продукта, которые заданы в виде Credentials в AWX
-
configure-first-logon — проверяет доступность среды для развертывания продукта и добавляет ключи для доступа к виртуальной машине с продуктом.
-
configure-repositories — настраивает доступ к репозиторию с пакетами для установки, по умолчанию используется встроенный на базе Nexus. При необходимости можно добавить внешний репозиторий.
-
configure-ntp — настраивает NTP-сервер.
-
linux_disk — создает дополнительные диски при указании в заказе продукта точки монтирования.
Разместите пакеты для установки в репозиторий.
+ В качестве встроенного репозитория для пакетов используется Nexus.
3. Создание графа в Конструкторе Cloudlink
Структура графа для сценария с продуктом Vault включает в себя 6 узлов, которые используют встроенные шаблоны или подграфы:
-
Узел Создание ВМ — создает виртуальную машину, на базе которой будет развернут продукт Vault.
-
Узел Создание UUID — генерирует уникальный идентификатор item.
-
Узел Создание Inventory — получает параметры.
-
Узел Настройка ВМ — выполняет плейбуки по развертыванию Vault на виртуальной машине.
-
Узел Создание item приложения — генерирует уникальный идентификатор item.
-
Узел Создание связи parent-child — создает формы отображения заказа.
В примере с Vault в форме будет отображаться: версия Vault, точка подключения, а также Root Token и Unseal Keys развёрнутого Vault.
3.1. Ввод основных данных графа
-
В Control Panel Cloudlink перейдите в Конструктор → Графы и нажмите +.
-
Во вкладке Общая информация введите следующие параметры:
-
Код графа — уникальный символьный идентификатор продукта. Он может содержать только прописные латинские символы, цифры, нижнее подчеркивание,тире двоеточие и точку.
-
Наименование — символьное название продукта.
-
Тип — выберите creating.
-
Описание(опционально) — укажите отличительную особенность продукта.
-
Автор — введите имя или инициалы автора продукта.
Код графа,наименование и автор необходимы для идентификации и управления графом в системе. -
При необходимости активируйте опции, отрабатывающие в случае некорректного проигрывания графа: Переводить заказ в статус Ошибка и Блокировать заказ при ошибке.
-
3.2. Создание узлов графа
Добавьте узлы в граф:
-
Для этого перейдите во вкладку Узлы и нажмите кнопку +.
-
Создайте первый узел:
-
Введите основные свойства:
-
Название —
create_vm -
Описание —
Создание ВМ -
Подграф — выберите
create_vm_general
-
-
Во вкладке Параметры:
-
В блоке 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" }
-
-
Нажмите Добавить, чтобы завершить создание первого узла.
-
-
Во вкладке Узлы нажмите кнопку + и создайте второй узел:
-
Введите основные свойства:
-
Название —
ge_uuid -
Описание —
Создание UUID -
Шаблон — выберите
jinja2_format
-
-
Во вкладке Параметры:
-
В блоке Static Data данные наследуются из первого узла в графе.
-
В блоке Input в качестве входящий данных укажите:
{"template": "uuidgen_template"} -
В блоке Output в качестве исходящий данных укажите:
{"formatted": "app_uuid"}
-
-
Нажмите Добавить, чтобы завершить создание второго узла.
-
-
Во вкладке Узлы нажмите кнопку + и создайте третий узел:
-
Введите основные свойства:
-
Название —
make_inventory -
Описание —
Создание Inventory -
Шаблон — выберите
jinja2_format
-
-
Во вкладке Параметры:
-
В блоке 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" }
-
-
Нажмите Добавить, чтобы завершить создание третьего узла.
-
-
Во вкладке Узлы нажмите кнопку + и создайте четвертый узел:
-
Введите основные свойства:
-
Название —
configuration_vm -
Описание —
Настройка ВМ -
Шаблон — выберите
ansible_awx
-
-
Во вкладке Параметры:
-
В блоке 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), которые вы указываете, должны совпадать с исходящими данными узла графа.
-
-
Нажмите Добавить, чтобы завершить создание четвертого узла.
-
-
Во вкладке Узлы нажмите кнопку + и создайте пятый узел:
-
Введите основные свойства:
-
Название -
create_app_item -
Описание -
Создание item приложения -
Подграф -
create_item_box
-
-
Во вкладке Параметры:
-
В блоке 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 исходящие параметры не заполняются.
-
-
Нажмите Добавить, чтобы завершить создание пятого узла.
-
-
Во вкладке Узлы нажмите кнопку + и создайте шестой узел:
-
Введите основные свойства:
-
Название —
create_parent_chain -
Описание —
Создание связи parent-child -
Шаблон —
add_event
-
-
Во вкладке Параметры:
-
В блоке Static Data данные наследуются из первого узла в графе.
-
В блоке Input в качестве входящий данных укажите::
{ "type": "enums.EventType.VM.value", "status": "app_uuid", "item_id": "item_id", "subtype": "enums.EventSubType.PARENT.value" } -
В блоке Output исходящие параметры не заполняются.
-
-
Нажмите Добавить, чтобы завершить создание шестого узла.
-
-
Нажмите Сохранить, чтобы сохранить граф.
4. Создание шаблона отображения
-
Перейдите в раздел Конструктор → Шаблоны отображения.
-
Нажмите кнопку +.
-
Во вкладке Основное укажите следующие параметры:
-
Наименование — введите название создаваемого шаблона. Это значение будет отображаться в списке шаблонов.
-
Код шаблона — задайте уникальный символьный идентификатор шаблона. Может содержать только строчные латинские буквы, цифры, символы дефиса (
-) и подчёркивания (_). -
Описание (опционально) — добавьте краткое описание шаблона.
-
Состояние — переключатель активности шаблона.
-
Если включено, шаблон доступен для использования в системе.
-
Если выключено, шаблон не отображается в системе.
-
-
Тип — выберите тип шаблона из списка. Например,
app. -
Провайдер — укажите провайдера, с которым связан шаблон.
Наименование, Код шаблона и Провайдер необходимы для идентификации и корректного отображения шаблона в системе.
-
-
Перейдите во вкладку Полное отображение и опишите шаблон отображения вкладок, меток и других элементов в формате JSON.
-
Нажмите Сохранить.
Вы можете предварительно просмотреть отображение описанного шаблона для приложения, нажав на кнопку Просмотр.
