Добавлений немного, но их стоит знать, ведь это поможет расширить ваши возможности при работе с Terraform.
Давайте рассмотрим самые нужные новые фичи при работе с модулями.
Разворачивать инфраструктуру будем в aws. Создадим три vpc
и сети для dev
, stage
и prod
контуров.
source
- сообщает Terraform, где найти исходный код для желаемого child
модуля.
Источники бывают разные, мы будем использовать локальный путь к модулю env
, для упрощения кода указываем, какой именно контур vpc_cidr
- диапазон IPv4-адресов для нашего VPC в формате блока CIDR.
Переменные следующие:
variable "vpc_network_cidr" {
default = {
dev = "172.16.1.0/24"
stage = "172.17.1.0/24"
prod = "172.18.1.0/24"
}
}
variable "region" {
default = "eu-west-2"
}
Как видим, используется модуль. Его структура довольно проста:
cidr_block
– это про диапазон IPv4-адресов для вашего VPC в формате блока CIDR. Размеры блоков должны быть между маской сети / 16 и маской сети / 28
tags
- создает тег с ключом "Имя" и указанным вами значением
vpc_id
- идентификатор VPC для создания
Переменные для модуля следующие:
variable "vpc_cidr" {
default = "172.16.0.0/16"
}
variable "env" {
default = "dev"
}
variable "public_subnet_cidrs" {
default = [
"172.16.1.0/24"
]
}
variable "private_subnet_cidrs" {
default = [
"172.16.2.0/24"
]
}
Допустим, мы хотим создать модуль vpc-prod
только после того, как создадутся два предыдущих. В Terraform v0.13 это можно сделать с помощью следующего добавления:
depends_on = [module.vpc-dev, module.vpc-stage]
в секции module "vpc-prod"
.
На выходе, после запуска создания инфраструктуры, можно увидеть, что сначала одновременно создались сети для dev
и stage
контуров и, только после их создания, создалась сеть и vpc
для prod
контура.
В самом AWS созданные нами vps
и сети будут выглядеть следующим образом:
Еще одно из нововведений - это возможность использовать цикл. Из плюсов – ваш код значительно уменьшится.
Циклы создаются с помощью count
и for_each
. В предыдущих версиях Terraform функции for_each
и count
позволяли систематически создавать несколько экземпляров ресурсов из одного блока ресурсов на основе данных из других частей модуля.
Terraform 0.13 предоставляет аналогичную возможность для целых модулей, позволяя одному блоку модуля систематически создавать несколько экземпляров модуля.
Мета-аргумент for_each
принимает карту или набор строк и создает экземпляр для каждого элемента в этой карте или наборе. С каждым экземпляром связан отдельный объект инфраструктуры и каждый отдельно создается, обновляется или уничтожается при применении конфигурации.
В нашем случае мы используем карту: each.key
и each.value
.
each.key - ключ карты, соответствующий этому экземпляру.
each.value
- значение карты, соответствующее этому экземпляру.
Мета-аргумент count
принимает целое число и создает указанное количество экземпляров модуля. С каждым экземпляром связан отдельный объект инфраструктуры и каждый отдельно создается, обновляется или уничтожается при применении конфигурации.
count.index
- номер отдельного индекса (начиная с 0), соответствующий этому экземпляру.
Делаем terraform apply
и видим, что те, которые count
, будут с индексом вида [0], те которые for_each
будут с именами контуров внутри.
В самом AWS созданные нами vps
и сети будут выглядеть следующим образом:
Данная статья была опубликована в преддверии старта курса Administrator Linux. Advanced. Узнать подробнее о курсе можно по ссылке. А также предлагаем вам посмотреть запись бесплатного демо-урока по теме «Кластерная файловая система Lustre».
CrazyOpossum
Breaking news!
13-ый терраформ уже почти полгода как вышел. С декабря уже вообще 14-ый.
OkGoLove
Более того, описанные в статье вещи появились в 0.12.
OkGoLove
Ну вот, я ошибся. В статье такая подача про for_each и count, что я ее подумал, что это не относится к реализации этих фич для модулей.