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 – пакет интеграции.