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: