• Terraform поддерживает условные выражения в формате ?:. Это тернарный синтаксис, с которым вы можете быть знакомы по другим языкам программирования. Он проверит булеву логику в CONDITION и, если результат равен true, вернет TRUE_VAL; в противном случае возвращается FALSE_VAL.
В строковой директиве можно указать маркер ~, чтобы удалить все пробельные символы (пробелы и перенос строки) перед ней (если маркер находится в начале директивы) или после нее (если маркер находится в конце директивы):
output "for_directive_strip_marker" {
value = <
Строковая директива for имеет следующий синтаксис:
%{ for in }%{ endfor }
COLLECTION — список или ассоциативный массив, который нужно перебрать, ITEM — имя локальной переменной, которое назначается каждому элементу COLLECTION, а BODY — это то, что выводится на каждой итерации (здесь можно ссылаться на ITEM). Например:
variable "names" {
description = "Names to render"
type = list(string)
default = ["neo", "trinity", "morpheus"]
}
output "for_directive" {
value = <
Выражение for может вернуть ассоциативный массив вместо списка, используя следующий синтаксис:
# Циклический перебор списков
[for in : => ]
# Циклический перебор ассоциативных массивов
{for , in : => }
Разница лишь в том, что: а) выражение помещается в фигурные скобки вместо прямоугольных; б) на каждой итерации выводится не только значение, но еще и ключ, отделенный от него стрелкой. Например, так можно перевести в верхний регистр все ключи и значения ассоциативного массива:
variable "hero_thousand_faces" {
description = "map"
type = map(string)
default = {
neo = "hero"
trinity = "love interest"
morpheus = "mentor"
}
}
output "upper_roles" {
value = {for name, role in var.hero_thousand_faces : upper(name) => upper(role)}
}
Выражение for в Terraform также поддерживает циклический перебор ассоциативных массивов с использованием такого синтаксиса:
[for , in : ]
MAP — это ассоциативный массив, который нужно перебрать, KEY и VALUE — имена локальных переменных, которые назначаются каждой паре «ключ — значение» в MAP, а OUTPUT — выражение, которое каким-то образом преобразует KEY и VALUE. Например:
variable "hero_thousand_faces" {
description = "map"
type = map(string)
default = {
neo = "hero"
trinity = "love interest"
morpheus = "mentor"
}
}
output "bios" {
value = [for name, role in var.hero_thousand_faces : "${name} is the ${role}"]
}
variable "names" {
description = "A list of names"
type = list(string)
default = ["neo", "trinity", "morpheus"]
}
output "short_upper_names" {
value = [for name in var.names : upper(name) if length(name) < 5]
}
Выполнив terraformapply для этого кода, вы получите следующее:
short_upper_names = [
"NEO",
]
Terraform предлагает похожие возможности в виде выражения for (не путать с выражением for_each из предыдущего раздела). У него следующий базовый синтаксис:
[for in : ]
LIST — это список, который нужно перебрать, ITEM — имя локальной переменной, которое будет назначено каждому элементу списка, а OUTPUT — выражение, которое каким-то образом преобразует ITEM. Например, вот код Terraform для перевода списка имен в var.names в верхний регистр:
variable "names" {
description = "A list of names"
type = list(string)
default = ["neo", "trinity", "morpheus"]
}
output "upper_names" {
value = [for name in var.names : upper(name)]
}
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
}
}
}
Так выглядит синтаксис динамической генерации вложенных блоков:
dynamic "" {
for_each =
content {
[CONFIG...]
}
}
VAR_NAME — имя переменной, которая будет хранить значение каждой итерации (вместо each), COLLECTION — список или ассоциативный массив, который нужно перебрать, а блок content — это то, что генерируется при каждом проходе. Внутри блока content можно использовать ссылки .key и .value для доступа к ключу и соответственно к значению текущего элемента COLLECTION. Стоит отметить, что, когда вы применяете for_each в сочетании со списком, key содержит индекс, value — элемент с этим индексом. В случае с ассоциативным массивом key и value представляют собой одну из его пар типа «ключ — значение».
почти всегда следует выбирать for_each вместо count