В двух предыдущих статьях рассматривалась работа vRealize Automation 8 с Ansible Open Source. В нашей инфраструктуре для работы с Ansible уже используется Polemarch, а интеграции с ним в vRA 8 нет. Чтобы не ждать разработки интеграции от VMware, сделаем её самостоятельно с помощью Custom Resources и Dynamic Types.
Polemarch — система управления инфраструктурой на основе Ansible, имеющая простой веб-интерфейс и API. Polemarch сфокусирован на самом необходимом функционале — это спартанский конкурент Ansible Tower.
Пакет интеграции vRA — Polemarch
v1.0.0
В данной версии реализованы основные процессы для работы с объектами Polemarch, а также процессы для интеграции с vRA, включающие:
- создание и настройку инвентори;
- передачу пользовательских переменных;
- задание списка плейбуков и их запуск после развёртывания VM;
- задание списка плейбуков и их запуск перед удалением VM.
vRA. Custom Resource
Если в vRA 7 любой процесс из оркестратора можно было опубликовать как XaaS и использовать его при создании блюпринтов, то в версии vRA 8 это уже не так (текущая версия 8.1). С портала vRA по-прежнему можно предоставить доступ с к любому процессу, настраивается это в Service Broker. А для использования workflow в составе блюпринтов требуется создание Custom Resource (пользовательский ресурс). Это мощный инструмент, с помощью него Вы можете значительно расширить функционал блюпринтов, поскольку не будете ограничены набором типов vRA. Для нового Custom Resource требуется указать тип создаваемого объекта. Правильными считаются два варианта: разработка нового типа в Plug-in SDK или создание собственного типа DynamicTypes. Для второго не нужно быть продвинутым программистом, и его функционала достаточно для большинства задач.
Данный пакет интеграции включает тип DynamicTypes:Polemarch.Playbook и все необходимые процессы. С точки зрения Polemarch, этот тип правильнее было назвать Inventory а не Playbook, потому что для каждого такого объекта создаётся выделенный инвентори, в нём регистрируются хосты и пользовательские переменные. После создания всех объектов запускаются на выполнение плейбуки из списка provision. Если список de_provision не содержит плейбуков, то инвертори сразу удаляется, чтобы в vRO не скопилась куча старых объектов (инвертори в Polemarch можно и не удалять, в запросе списка инвентори используется фильтр по переменной: variables=active:true, достаточно установить её в false). Custom Resource создаётся для типа DynamicTypes:Polemarch.Playbook (см. скриншот справа).
vRA. Блюпринты
Входные параметры процесса «Start provision playbooks» (этот процесс указан при создании Custom Resource в поле Lifecycle Actions — Create) будут доступны как редактируемые поля после добавления нашего ресурса в блюпринт.
Пример блюпринта с одной виртуальной машиной:

formatVersion: 1
name: Polemarch SingleVM
version: 1
inputs: {}
resources:
Config_VM:
type: Custom.Polemarch.Playbook
dependsOn:
- VM
properties:
hosts: '${resource.VM.address}'
inventoryName: 'vRA_${env.deploymentId}'
playbooks:
- provision:
- centod_config.yml
hostVariables: |
deploy_server: true
server_type: vRA
env_type: test
VM:
type: Cloud.Machine
properties:
image: CentOS_7
flavor: small
customizationSpec: tmp-linux-vra
networks:
- network: '${resource.vSphere_Network.id}'
assignment: static
vSphere_Network:
type: Cloud.vSphere.Network
properties:
networkType: existing
Пример блюпринта с несколькими виртуальными машинами и двумя Custom Resource:

formatVersion: 1
name: Polemarch MultiVM
version: 1
inputs: {}
resources:
Install_App:
type: Custom.Polemarch.Playbook
dependsOn:
- App_VMs
- Install_DB
properties:
hosts: '${join(resource.App_VMs.address, ",")}'
inventoryName: '${join(["vRA", env.deploymentId, "app"], "_")}'
playbooks:
- provision:
- centos_config.yml
- soft_install.yml
hostVariables: |
deploy_server: true
server_type: vRA
env_type: test
install_tomcat: true
Install_DB:
type: Custom.Polemarch.Playbook
dependsOn:
- DB_VMs
properties:
hosts: '${resource.DB_VMs.address}'
inventoryName: '${join(["vRA", env.deploymentId, "db"], "_")}'
playbooks:
- provision:
- centos_config.yml
- soft_install.yml
de_provision:
- db_backup.yml
hostVariables: |
deploy_server: true
server_type: vRA
env_type: test
install_postgresql: true
pg_version: 12
App_VMs:
type: Cloud.Machine
properties:
count: 3
image: CentOS_7
flavor: small
customizationSpec: tmp-linux-vra
networks:
- network: '${resource.vSphere_Network.id}'
assignment: static
DB_VMs:
type: Cloud.Machine
properties:
image: CentOS_7
flavor: medium
customizationSpec: tmp-linux-vra
networks:
- network: '${resource.vSphere_Network.id}'
assignment: static
vSphere_Network:
type: Cloud.vSphere.Network
properties:
networkType: existing
Код блюпринтов доступен на https://github.com/isas2/vra.
Подготовка пакета к работе
1. Установите пакет в vRealize Orchestrator:
- Скачайте vRO пакет ru.zabedu.polemarch.package;
- ВНИМАНИЕ! НЕ нужно импортировать пакет ru.zabedu.polemarch.package через вкладку Packages, он содержит настройки DynamicTypes, которые не будут применены при импорте;
- Перейдите во вкладку Workflows, Library->Dynamic Types->Configuration, запустите процесс «Import Configuration From Package» и выберите файл «ru.zabedu.polemarch.package»;
- Убедитесь, что все элементы успешно импортированы: процессы, действия, конфигурационные элементы, новые типы DynamicTypes.
2. Запустите процесс начальной настройки «Initialize», который выполнит:
- Регистрацию REST хост — «Add Polemarch REST host» и сохранение ссылки на хост в конфигурационном элементе polemarchConfig;
- Запуск процесса регистрации используемых REST-операций: «Add Polemarch REST operations»;
- Получение и сохранение токена Polemarch: «New token»;
- Сохранение в конфигурационном элементе polemarchConfig ID основного проекта в Polemarch и имени удалённого пользователя для доступа к виртуальным машинам.
- Имена проекта и пользователя можно указать в блюпринте, но если их указать в конфигурационном элементе, то в блюпринтах можно опускать.
3. Создайте Custom Resource и блюпринты в vRA:
- Создайте новый Custom Resource для типа DynamicTypes:Polemarch.Playbook;
- Создайте и настройте блюпринты.
