Новый архитектурный дизайн в многоэтапном конвейере Terraform CD от Jenkins для улучшения детализации CI/CD.

Обычно, когда мы выполняем terraform plan, terraform destroy или terraform apply, мы применяем эти действия ко всем ресурсам в наших целевых файлах, часто main.tf (вы можете использовать любое имя для файла, но это имя используется только как соглашение).

В эпоху CI/CD, когда у нас есть все в виде конвейеров, начиная с данных и кода приложения и заканчивая кодом инфраструктуры, такая гранулярность обычно затруднена. Обычно, по крайней мере в Terraform, для выполнения этих трех разных действий у нас есть три разных конвейера для выполнения terraform plan: terraform apply и terraform destroy. И когда мы выбираем определенное действие (скажем, terraform plan), это действие выполняется на всех этапах и на всех ресурсах в конвейере.

Но когда мы наблюдаем за всеми этими пайплайнами, мы обнаруживаем общность, которую можно абстрагировать, чтобы создать общность, на которой может быть унаследована динамическая природа. Точно так же, как мы создаем класс, используя разные объекты с разными значениями атрибутов, можно ли создать аналогичный базовый класс (читай конвейеры), который при создании экземпляра может создавать разные объекты конвейера?

###Один конвейер для их создания###

Модульная инфраструктура

Чтобы построить этот конвейер на основе классов, нам сначала нужно создать скрипт terraform. Этот разработанный сценарий должен быть слабосвязанным и иметь модульный характер. Для этого мы создали этот модульный скрипт, который состоит из трех модулей: «Сеть», «Вычисления» и «Уведомления». Компоненты, которые создает каждый из этих модулей, следующие:

  1. Сеть: 1 VPC и 1 подсеть
  2. Вычисления: 1 роль IAM, 1 Lambda, 1 экземпляр EC2 t2.micro
  3. Уведомления: 1 тема SNS и 1 подписка на электронную почту

И структура файла следующая:

Когда все будет готово, давайте создадим отличный скрипт в декларативном стиле в файле Jenkins.

Конвейер Jenkins на основе классов

Чтобы создать этот стиль архитектуры на основе классов для гибкого создания объектов конвейера на уровне действий и ресурсов, мы собираемся использовать функцию, называемую «параметрами» в Jenkins. Эта функция помогает нам создавать несколько объектов с использованием одного конвейера Jenkins базового класса. В этом примере давайте создадим три действия, а именно:

  • terraform plan: Это создает и распечатывает план ресурсов, которые мы собираемся создать в соответствующем провайдере (может быть AWS, Kubernetes, GCP, Azure и т. д.)
  • terraform apply: Эта команда создает ресурсы в соответствующем провайдере и создает файл состояния, в котором сохраняется текущее состояние ресурсов.
  • terraform destroy: удаляет все ресурсы, перечисленные в файле состояния.

Эти действия выполняются с тремя модулями/ресурсами, а именно «Сеть», «Вычисления» и «Уведомления».

Вышеупомянутые параметры создают пользовательский интерфейс для конечного пользователя, как показано ниже, который поможет конечному пользователю создавать объекты базового конвейера на лету.

На основе выбранных действий и ресурсов, на которых эти действия должны выполняться, Jenkins создаст динамический конвейер в соответствии с вашими требованиями. На рисунке ниже мы видим, что мы применили terraform к сетевым и вычислительным ресурсам в № 24 и запустили terraform apply для сети и уведомлений в прогоне № 25. Чтобы очистить инфраструктуру, мы запустили terraform destroy в прогоне №26.

Реализованный в настоящее время подход больше соответствует принципам непрерывной доставки, чем непрерывного развертывания.

Файл Jenkins и код Terraform можно найти по этой ссылке.

Want to Connect?
Feel free to reach out to my LinkedIn for interesting content and productive discussions.