Terraform: инфраструктура на уровне кода | страница 107
$ 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
Вы уже знаете, как циклически перебирать ресурсы и вложенные блоки. Но если с помощью цикла нужно сгенерировать лишь одно значение? Немного отвлечемся и рассмотрим некоторые примеры, не связанные с кластером веб-серверов. Представьте, что вы написали код Terraform, который принимает на вход список имен:
variable "names" {
description = "A list of names"
type = list(string)
default = ["neo", "trinity", "morpheus"]
}
Как бы вы перевели все эти имена в верхний регистр? В языке программирования общего назначения, таком как Python, можно было бы написать следующий цикл:
names = ["neo", "trinity", "morpheus"]
upper_case_names = []
for name in names:
upper_case_names.append(name.upper())
print upper_case_names
# Выводит: ['NEO', 'TRINITY', 'MORPHEUS']
Python позволяет выразить точно такой же код одной строчкой, используя синтаксис под названием «абстракция списков» (list comprehension):
names = ["neo", "trinity", "morpheus"]
upper_case_names = [name.upper() for name in names]
print upper_case_names
# Выводит: ['NEO', 'TRINITY', 'MORPHEUS']
Python также позволяет отфильтровать итоговый список по заданному выражению:
names = ["neo", "trinity", "morpheus"]
short_upper_case_names = [name.upper() for name in names if len(name) < 5]
print short_upper_case_names
# Выводит: ['NEO']
Terraform предлагает похожие возможности в виде выражения for (не путать с выражением for_each из предыдущего раздела). У него следующий базовый синтаксис: