Читаем Terraform: инфраструктура на уровне кода полностью

Рассмотрим еще одно преимущество выражения for_each: его способность создавать множественные вложенные блоки внутри ресурса. Например, с его помощью можно динамически сгенерировать вложенные блоки tag для ASG в модуле webserver-cluster. Чтобы пользователь мог указывать собственные теги, добавим в файл modules/services/webserver-cluster/variables.tf новую входную переменную с ассоциативным массивом под названием custom_tags:

variable "custom_tags" {

  description = "Custom tags to set on the Instances in the ASG"

  type        = map(string)

  default     = {}

}

Далее установим некоторые пользовательские теги в промышленной среде в файле live/prod/services/webserver-cluster/main.tf:

module "webserver_cluster" {

  source = "../../../../modules/services/webserver-cluster"

  cluster_name           = "webservers-prod"

  db_remote_state_bucket = "(YOUR_BUCKET_NAME)"

  db_remote_state_key    = "prod/data-stores/mysql/terraform.tfstate"

  instance_type      = "m4.large"

  min_size           = 2

  max_size           = 10

  custom_tags = {

    Owner      = "team-foo"

    DeployedBy = "terraform"

  }

}

В этом листинге устанавливается несколько полезных тегов: Owner определяет, какой команде принадлежит ASG, а DeployedBy сигнализирует, что данная инфраструктура была развернута с помощью Terraform (это говорит о том, что ее не следует редактировать вручную; см. подраздел «Даже хороший план может оказаться неудачным» на с. 207). Обычно имеет смысл выработать систему тегов внутри своей команды и воплотить ее в виде кода с помощью модулей Terraform.

Итак, вы указали свои теги. Но как назначить их ресурсу aws_autoscaling_group? Для этого нужно циклически перебрать var.custom_tags. Пример этого показан в следующем псевдокоде:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns    = [aws_lb_target_group.asg.arn]

  health_check_type    = "ELB"

  min_size = var.min_size

  max_size = var.max_size

  tag {

    key                 = "Name"

    value               = var.cluster_name

    propagate_at_launch = true

  }

  # Это просто псевдокод. Он не будет работать в Terraform.

  for (tag in var.custom_tags) {

    tag {

      key                 = tag.key

      value               = tag.value

      propagate_at_launch = true

    }

  }

}

Псевдокод, приведенный выше, работать не будет. Вместо него мы воспользуемся выражением for_each. Так выглядит синтаксис динамической генерации вложенных блоков:

dynamic "" {

  for_each =

  content {

     [CONFIG...]

  }

}

VAR_NAME — имя переменной, которая будет хранить значение каждой итерации (вместо each), COLLECTION — список или ассоциативный массив, который нужно перебрать, а блок content — это то, что генерируется при каждом проходе. Внутри блока content можно использовать ссылки .key и .value для доступа к ключу и соответственно к значению текущего элемента COLLECTION. Стоит отметить, что, когда вы применяете for_each в сочетании со списком, key содержит индекс, value — элемент с этим индексом. В случае с ассоциативным массивом key и value представляют собой одну из его пар типа «ключ — значение».

Соберем все это вместе и динамически сгенерируем блоки tag в ресурсе aws_autoscaling_group с помощью for_each:

resource "aws_autoscaling_group" "example" {

  launch_configuration = aws_launch_configuration.example.name

  vpc_zone_identifier  = data.aws_subnet_ids.default.ids

  target_group_arns    = [aws_lb_target_group.asg.arn]

  health_check_type    = "ELB"

  min_size = var.min_size

  max_size = var.max_size

  tag {

    key                 = "Name"

    value               = var.cluster_name

    propagate_at_launch = true

  }

  dynamic "tag" {

    for_each = var.custom_tags

    content {

      key                 = tag.key

      value               = tag.value

      propagate_at_launch = true

    }

  }

}

Теперь, если выполнить terraformapply, план действий будет выглядеть примерно так:

$ terraform apply

Terraform will perform the following actions:

  # aws_autoscaling_group.example will be updated in-place

  ~ resource "aws_autoscaling_group" "example" {

        (...)

        tag {

            key                 = "Name"

            propagate_at_launch = true

            value               = "webservers-prod"

        }

      + tag {

          + key                 = "Owner"

          + propagate_at_launch = true

          + value               = "team-foo"

        }

      + tag {

          + key                 = "DeployedBy"

          + propagate_at_launch = true

          + value               = "terraform"

        }

    }

Plan: 0 to add, 1 to change, 0 to destroy.

Do you want to perform these actions?

  Terraform will perform the actions described above.

  Only 'yes' will be accepted to approve.

  Enter a value:

Введите yes, чтобы развернуть изменения. В веб-консоли EC2 должны появиться новые теги, как показано на рис. 5.1.

Рис. 5.1. Динамические теги группы автомасштабирования

Циклы на основе выражений for

Перейти на страницу:

Все книги серии Бестселлеры O'Reilly

Искусство управления IT-проектами
Искусство управления IT-проектами

В отличие от множества трудов, посвященных руководству проектами и командами, в этой книге не проповедуются никакие новые учения и не превозносятся великие теории. Скотт Беркун считает залогом успеха практику и разнообразие подходов. В книге описываются основные сложности и проблемные ситуации, возникающие в работе менеджера проекта, даны рекомендации по выходу из них.Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Скотт Беркун

Деловая литература
iOS. Приемы программирования
iOS. Приемы программирования

Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.

Вандад Нахавандипур

Программирование, программы, базы данных / Программирование / Книги по IT

Похожие книги