Перейти к содержанию

Интеграция с облачным провайдером 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» включает в себя несколько этапов:

  1. Задание пользователем статичных данных о ВМ (в т.ч. реквизитов подключения к целевому облаку). На этом этапе предполагается создание диалоговых форм в графическом интерфейсе;
  2. Задание (запрос) динамических данных необходимых для создания ВМ. Например, списка образов ОС. На этом этапе предполагается организация взаимодействия с внешним API облачного провайдера;
  3. Подготовка набора файлов, включающего в себя «terraform-манифесты» описывающие целевое состояние создаваемой ВМ, а также вспомогательные скрипты для организации жизненного цикла компонентов «terraform-окружения».

Схема взаимодействия компонентов представлена ниже:

Рисунок 26

При заказе услуги происходит подготовка переменных и первичная настройка сервиса Нимбиус:

  • Меняется имя сервиса;
  • Устанавливается «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'

Дальнейшие действия с услугой описаны в разделе Настройка услуги «Создание ВМ в публичном облаке Яндекс.Облако».