Интеграция с облачным провайдером Yandex.Cloud
Описание принципа работы услуги¶
Создание услуги¶
При каждом заказе услуги создания ВМ в публичном облаке, запросу присваивается уникальный идентификатор («id»), который генерируется методом get_session_id
(«Service/DynamicDialogs»). Данный идентификатор используется в качестве имени директории в контейнере «terraform» и имени базы данных в контейнере «postgresql», которые создаются в процессе создания услуги.
Основная логика работы услуги содержится в методе create_vm_with_tf
(«Integration/MIQ_Shell /Shell»). В процессе развертывания услуги из git репозитория в контейнер «terraform» скачивается набор файлов необходимый для обеспечения взаимодействия с облачным провайдером.
Для заказа услуги пользователь заполняет данные в диалоговой форме и запускает процесс создания. Данные из диалоговой формы передаются в файлы «*.tf» и «*.sql», которые находятся в директории контейнера «terraform». После чего производиться запуск команд terraform init
и terraform apply
. Все команды по работе с «.tf» файлами вызываются с
помощью командной оболочки «shell».
Удаление услуги¶
Основная логика работы механизма удаления услуги ВМ в публичном облаке содержится в методе «delete_vm_with_tf» («Integration/MIQ_Shell/Shell»). Для удаления услуги берется ее уникальный идентификатор («id»), который находится в пользовательских атрибутах («custom attributes») этой услуги. По данному идентификатору вызывается команда «terraform destroy» из директории услуги. После чего удаляется ее база данных и сама директория услуги.
Взаимодействие компонентов услуги¶
Взаимодействие между контейнерами «terraform» и «nimbius» осуществляется с использованием протокола «ssh». Для корректной работы услуги, следует обеспечить наличие необходимых для взаимодействия ssh-ключей в контейнерах «nimbius» и «terraform». Помимо этого, в контейнере «terraform» необходимо обеспечить наличие в директории «.ssh» файла «environment» с переменными для подключения к контейнеру с базой данных.
Порядок действий по настройке услуги «ВМ в публичном облаке» на примере Yandex.Cloud.¶
Организация услуги «ВМ в публичном облаке Yandex.Cloud» включает в себя несколько этапов:
- Задание пользователем статичных данных о ВМ (в т.ч. реквизитов подключения к целевому облаку). На этом этапе предполагается создание диалоговых форм в графическом интерфейсе;
- Задание (запрос) динамических данных необходимых для создания ВМ. Например, списка образов ОС. На этом этапе предполагается организация взаимодействия с внешним API облачного провайдера;
- Подготовка набора файлов, включающего в себя «terraform-манифесты» описывающие целевое состояние создаваемой ВМ, а также вспомогательные скрипты для организации жизненного цикла компонентов «terraform-окружения».
Схема взаимодействия компонентов представлена ниже:
При заказе услуги происходит подготовка переменных и первичная настройка сервиса Нимбиус:
- Меняется имя сервиса;
- Устанавливается «custom_attribute» «session_id» на сервис, который был сгенерирован на этапе заполнения формы.
Создается директория с именем «session_id» в контейнере «terraform», куда будут копироваться манифесты для выполнения. Выполняется git clone
репозитория с «terrafrom» манифестами в контейнер с Нимбиус. Далее происходит передача параметров из диалоговой формы в файлы. Все изменения происходят по средствам вызова «shell» команд из метода «ruby». Пример из метода «Integration/MIQ_Shell/Shell/create_vm_with_tf»:
run_cmd("sed -i \"s/%#{k}%/#{v}/g\" #{PATH_TO_MANIFESTS}/#{file}")
где: s/%#{k}%/#{v}/g
#{k}
- что меняется, в манифесте %YC_FOLDER_ID%;#{v}
- на что меняется, значение берется из формы.
#{PATH_TO_MANIFESTS}/#{file}
#{PATH_TO_MANIFESTS}
- путь до репозитория клонированного ранее;#{file}
- файл в котором происходит замена.
Итоговая команда выглядит примерно так:
sed -i "s/%yc_folder_id%/b1g79dmmdt72aa0goj8i/g"
create-vm-service/ya-create-vm/vars.tf
Далее измененные файлы копируются в контейнер с «terraform» с помощью команды «scp».
sed -i "s/%yc_folder_id%/b1g79dmmdt72aa0goj8i/g"
create-vm-service/ya-create-vm/vars.tf
Удаляется директория с репозиторием в контейнере Нимбиус. Далее создается БД для хранения «terraform.tfstate», данная БД создается в контейнере с БД Нимбиус. Вызов представленный ниже использует «ssh» для подключения к «terraform» контейнеру и «psql» для подключения к БД.
ssh -o 'StrictHostKeyChecking no' root@terraform 'PGPASSWORD=$DB_PASSWD
psql -h db -U $DB_USER -f /infra/DWHm9nY8Ui/create_db.sql'
Далее в контейнере «terraform» вызывается «terraform init».
ssh -o 'StrictHostKeyChecking no' root@terraform 'terraform
-chdir=/infra/DWHm9nY8Ui init
-backend-config="conn_str=postgres://$TF_DB_USER:$TF_DB_PASSWD@$DB_SRV:5432/DWHm9nY8Ui-tfstate?sslmode=disable"'
А затем «terraform apply».
ssh -o 'StrictHostKeyChecking no' root@terraform
'terraform -chdir=/infra/DWHm9nY8Ui/ apply -auto-approve'
Дальнейшие действия с услугой описаны в разделе Настройка услуги «Создание ВМ в публичном облаке Яндекс.Облако».