Terraform: инфраструктура на уровне кода | страница 85
• Входные параметры модулей.
• Локальные переменные модулей.
• Выходные переменные модулей.
• Подводные камни.
• Управление версиями.
Примеры кода
Напоминаю: все примеры кода для этой книги можно найти по адресу 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: