Читаем Terraform: инфраструктура на уровне кода полностью

4. Повторное использование инфраструктуры с помощью модулей Terraform

В конце главы 3 вы развернули архитектуру, показанную на рис. 4.1.

Рис. 4.1. Балансировщик нагрузки, кластер веб-серверов и база данных

Это хорошо работает в качестве первой среды, но их обычно нужно как минимум две: одна для финального тестирования внутри команды, а другая, промышленная, — для обслуживания реальных пользователей (рис. 4.2). В идеале обе среды должны быть почти идентичными, хотя, чтобы сэкономить, для среды финального тестирования важно инициализировать чуть меньше серверов (или серверы меньшего размера).

Рис. 4.2. Две среды, каждая со своим балансировщиком нагрузки, кластером веб-серверов и базой данных

Как добавить эту промышленную среду без копирования всего кода из среды тестирования? Например, как избежать дублирования всего содержимого stage/services/webserver-clusterиstage/data-stores/mysql в prod/services/webserver-cluster и соответственно prod/data-stores/mysql?

В языках общего назначения, таких как Ruby, код, который копируется и вставляется в нескольких местах, можно оформить в виде функции и использовать в других частях программы:

def example_function()

  puts "Hello, World"

end

# Другие участки вашего кода

example_function()

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

Рис. 4.3. Поместив код в модуль, вы сможете применить его повторно в разных окружениях

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

В этой главе я покажу, как создавать и применять модули Terraform. Мы рассмотрим такие темы.

• Основные характеристики модулей.

• Входные параметры модулей.

• Локальные переменные модулей.

• Выходные переменные модулей.

• Подводные камни.

• Управление версиями.

Примеры кода

Напоминаю: все примеры кода для этой книги можно найти по адресу github.com/brikis98/terraform-up-and-running-code.

Что такое модуль

В Terraform любой набор конфигурационных файлов, размещенных в одной папке, считается модулем. Вся конфигурация, которую вы уже написали, формально состоит из модулей, хоть и не очень интересных, так как вы развертывали их напрямую (модуль в текущей рабочей папке называется корневым). Чтобы увидеть всю их мощь, нужно использовать один модуль из другого.

В качестве примера превратим в универсальный модуль код из stage/services/webserver-cluster, который включает в себя Auto Scaling Group (ASG), Application Load Balancer (ALB), группы безопасности и многие другие ресурсы.

Для начала выполните terraformdestroy в stage/services/webserver-cluster, чтобы удалить все ресурсы, созданные вами ранее. Затем создайте новую папку верхнего уровня под названием modules и переместите все файлы из stage/services/webserver-cluster в modules/services/webserver-cluster. В итоге ваша структура папок должна выглядеть так, как на рис. 4.4.

Рис. 4.4. Структура папок с модулем и тестовой средой

Откройте файл main.tf в modules/services/webserver-cluster и уберите из него определение provider. Провайдеры должны настраиваться не самим модулем, а его пользователями.

Теперь можно воспользоваться этим модулем в тестовой среде, используя следующий синтаксис:

module "" {

  source = ""

  [CONFIG ...]

}

NAME — это идентификатор, который можно использовать в коде Terraform для обращения к модулю (вроде web-service), SOURCE — путь к коду модуля (скажем, modules/services/webserver-cluster), а CONFIG состоит из одного/нескольких аргументов, предназначенных специально для этого модуля. Например, вы можете создать новый файл stage/services/webserver-cluster/main.tf и использовать в нем модуль webserver-cluster следующим образом:

provider "aws" {

  region = "us-east-2"

}

module "webserver_cluster" {

  source = "../../../modules/services/

    webserver-cluster"

}

Затем вы можете повторно использовать тот же модуль в промышленной среде, создав новый файл prod/services/webserver-cluster/main.tf следующего содержания:

provider "aws" {

  region = "us-east-2"

}

module "webserver_cluster" {

  source = "../../../modules/services/webserver-cluster"

}

Вот и все: повторное использование кода в разных окружениях с минимальным дублированием. Обратите внимание, что при добавлении модуля в конфигурацию Terraform или изменении параметра модуля source необходимо сначала выполнить команду init, а только потом plan или apply:

$ terraform init

Initializing modules...

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги