Рассмотрим еще одно преимущество выражения 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 можно использовать ссылки
Соберем все это вместе и динамически сгенерируем блоки 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
Вильям Л Саймон , Вильям Саймон , Наталья Владимировна Макеева , Нора Робертс , Юрий Викторович Щербатых
Зарубежная компьютерная, околокомпьютерная литература / ОС и Сети, интернет / Короткие любовные романы / Психология / Прочая справочная литература / Образование и наука / Книги по IT / Словари и Энциклопедии