Добавлений немного, но их стоит знать, ведь это поможет расширить ваши возможности при работе с 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».


ЗАБРАТЬ СКИДКУ