vRealize Automation и vRealize Orchestrator легко интегрируются с различными публичными облаками, это позволяет создать единую корпоративную облачную платформу. Яндекс.Облако — новый игрок на этом рынке, и он ещё не имеет готовых плагинов/пакетов для интеграции со многими сторонними облачными решениями. Поэтому нам пришлось самостоятельно разрабатывать пакет для его интеграции с vRO.
Цель разработки первой версии пакета — подготовить минимальный набор инструментов для создания и управления виртуальными машинами в Яндекс.Облаке. Мы не ставили перед собой задачи реализовать полный набор процессов, соответствующий всем возможностям облака.
С чего обычно начинают работу? С изучения документации. И тут Вас ждёт основная проблема: документации мало и она очень сырая. Многие элементарные вопросы решаются только через обращение в поддержку, которая работает довольно оперативно.
Пакет интеграции vRO — Яндекс.Облако
v1.0.3
Аутентификация в API
Для работы Вам потребуется IAM-токен, он используется в заголовках запросов при обращении к Яндекс.Облаку через API:
Authorization: Bearer <IAM-TOKEN>
Для получения IAM-токена создайте сервисный аккаунт и авторизованный ключ для него (не забудьте сохранить открытый и закрытый ключи). Далее есть два пути: создание токена через CLI или создание JWT-токена для обмена его на IAM-токен. Выбор за Вами, но в своих процессах мы используем JWT-токен и создаём его через python-скрипт (в документации есть примеры для всех основных языков программирования). Этот JWT-токен передаётся в https://iam.api.cloud.yandex.net/iam/v1/tokens, сервер вернёт в ответе сам IAM-токен и срок его действия:
{ "iamToken": "CggVAgAAAB...........AU4AVABWgA", "expiresAt": "2019-10-17T15:00:03.587843Z" }
Время жизни IAM-токена — 12 часов, поэтому его обновление лучше делать по расписанию, или проверять его «срок годности» перед отправкой API-запросов и получать при необходимости новый токен.
Процесс создания JWT-токена называется «Get JWT token», а процесс получения нового IAM-токена: «Get new IAM token». Результат выполнения запроса (токен и срок его действия) сохраняется в конфигурационном элементе «yandexCloud» (Library -> Yandex).
Основные процессы
В пакете Вы найдете только процессы для оркестратора. XaaS блюпринты для vRealize Automation нарисуете сами, или пишите, отправлю.
- «New instance» — процесс создания новой виртуальной машины. Значения folderId и serviceAccountId берутся из конфигурационного элемента, всё остальное — входные параметры.
- Аттрибут content содержит пример запроса в формате JSON для создания стандартной VM и в элементе WF «Create request» значения его полей корректируются в соответствии с выбором пользователя.
- Чтобы пользователю при создании VM не указывать конкретный образ, в поле image подгружается не список стандартных образов, а список семейств образов и в элементе «Get image ID» для него выбирается самый свежий образ.
- При создании инстанса ему присваиваются две метки: имя владельца и название бизнес-группы. Обратите внимание, что имя метки должно соответствовать регулярному выражению [a-z][-_0-9a-z], а значение [-_0-9a-z].
- «Day2 instance ops» — процесс управления развёрнутыми виртуальными машинами. Первая версия процесса позволяет использовать четыре базовые операции: stop, start, restart, delete.
- На входе процесс ожидает строку с описанием инстанса в формате: «vm_name (vm_id, vm_status)» и требуемое действие. Список инстансов в нужном формате возвращает action getInstancesByGroup, если передавать на вход имя бизнес-группы, то пользователь будет видеть только инстансы данной бизнес-группы.
Вспомогательные процессы и действия

Процессы получения информации о доступных ресурсах и сетях:
- «Get clouds» — получение списка облаков, если ответ содержит только одно облако, то его ID сохраняется в конфигурационном элементе yandexCloud;
- «Get folders» — получение списка папок в облаке по его ID. На момент написания статьи данный запрос не работал и даже рекомендации службы поддержки никак не помогли, поэтому значение folderId нужно задать вручную в конфигурационном элементе yandexCloud или при вызове процесса «Initialize» (см. ниже). Все попытки вызова этого процесса возвращают ошибку: «You are not authorized for this operation.»
- «Get networks» — получение списка сетей;
- «Get subnets» — получение списка подсетей. Если не указывать значение в subnetName, то возвращается полный список подсетей.
- Фильтрация подсетей по имени происходит добавлением в запрос фильтра в следующем формате: filter=name=’имя_подсети’.
Процессы, используемые при создании и управлении инстансами:
- «Delete instance» — удаление инстанса по его ID;
- «Get disk types» — получение списка доступных типов дисков. На текущий момент используется два типа дисков: network-ssd и network-hdd;
- «Get images» — получение списка образов дисков в каталоге. Если в качестве folderId передать значение «standard-images», то в ответе получите массив всех стандартных образов Яндекс.Облака. Пример описания одного образа:
{
"productIds": [
"f2edt1b5di3n9fs5ugq2"
],
"os": {
"type": "LINUX"
},
"id": "fd87i96n5740k9d2g3ac",
"folderId": "standard-images",
"createdAt": "2019-02-07T10:58:54Z",
"name": "centos-7-1549536124",
"description": "Free Linux distribution based on Red Hat Enterprise Linux. Official website and documentation: https://www.centos.org",
"family": "centos-7",
"storageSize": "1052770304",
"minDiskSize": "8594128896",
"status": "READY"
} - «Get instances» — получение списка инстансов. Возможна фильтрация данного списка по установленным в инстансах меткам (см. описание «New instance»), проверяется значение метки rbru_subtenant;
Подготовка пакета к работе
После установки этого пакета нужно подготовить к работе процесс «Get JWT token»:
- создать сервисный аккаунт и авторизованный ключ;
- поместить скрипт get-yandex-jwt-token.py и закрытую часть авторизованного ключа на сервер с SSH-доступом (для работы скрипта требуются модули python PyJWT и cryptography);
- указать в данном скрипте ID сервисного аккаунта (service_account_id), ID используемого ключа (key_id) и путь до закрытого ключа;
- прописать путь до скрипта на сервере SSH в конфигурационном элементе yandexCloud в аттрибут getJwtTokenScriptPath;
- заменить в процессе «Get JWT token» вызов «Run SSH command (vrassh)» на свой процесс выполнения SSH-команд и настроить его параметры;
- проверить работу процесса, он должен вернуть ключ.
Далее необходимо зарегистрировать в vRealize Orchestrator все REST-хосты и операции на них. Яндекс выбрал не совсем удобный для нас вариант с использованием выделенных доменов для различных групп API-запросов: один нужен для получения токена, другой для работы с сетями и т.д. Для реализованных в пакете процессов используется четыре домена. Чтобы Вам немного упростить начало работы, в папке Configuration имеется специальный процесс «Initialize», который за Вас сделает:
- Сохранение ID рабочего каталога и ID сервисного аккаунта в конфигурационном элементе yandexCloud;
- Регистрацию REST хостов (4 шт) и сохранение ссылок на них в конфигурационном элементе: «Add Yandex REST hosts»;
- Добавление всех используемых REST-операций: «Add Yandex REST operations»;
- Получение нового IAM-токена: «Get new IAM token»;
- Создание расписания для обновления IAM-токена.
Файлы к статье
vRO-Yandex.Cloud-Integration.zip — пакет интеграции.