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. Поместив код в модуль, вы сможете применить его повторно в разных окружениях
Это очень важно. Модули являются ключевым аспектом написания универсального кода 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...
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии