#terraform #infrastructure-as-code
#терраформирование #инфраструктура как код #terraform
Вопрос:
Сейчас я нахожусь в процессе перехода на Terraform 12. Одной из главных особенностей здесь является более строгий HCL2, и мне это нравится.
Например, если у меня есть список карт:
elb_listeners = [
{
instance_port = 80
instance_protocol = "http"
lb_port = 80
lb_protocol = "http"
},
{
instance_port = 443
instance_protocol = "http"
lb_port = 443
lb_protocol = "https"
ssl_certificate_id = ARN certificate
}
Я могу вращать ее с помощью динамического блока, например:
dynamic "listener" {
for_each = [for listener in var.elb_listeners : {
instance_port = listener.instance_port
instance_protocol = listener.instance_protocol
lb_port = listener.lb_port
lb_protocol = listener.lb_protocol
}]
content {
instance_port = listener.value.instance_port
instance_protocol = listener.value.instance_protocol
lb_port = listener.value.lb_port
lb_protocol = listener.value.lb_protocol
}
}
Но давайте предположим, что у меня есть только один блок и возможен только один блок:
health_check {
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
target = "HTTP:8000/"
interval = 30
}
Я не хочу объявлять все эти переменные, я также хочу описать это как блок один раз в настройках. Да, здесь я также могу использовать dynamic_block
только с одним элементом, но здесь это будет выглядеть излишеством. Возможно ли это сделать? Нравится
health_check {
var.health_check
}
или что-то в этом роде.
Ответ №1:
Я понимаю, к чему вы клоните. Но я не думаю, что в настоящее время возможно «развернуть» карту внутри ресурса, например. Вы могли бы определить переменную map со значениями по умолчанию, хотя это займет больше строк кода.
variable health_check {
type = "map"
default = {
healthy_threshold = 2
unhealthy_threshold = 2
timeout = 3
target = "HTTP:8000/"
interval = 30
}
}
health_check {
healthy_threshold = var.health_check.healthy_threshold
unhealthy_threshold = var.health_check.unhealthy_threshold
timeout = var.health_check.timeout
target = var.health_check.target
interval = var.health_check.interval
}
С другой стороны, я не понимаю, зачем вам это нужно. Это делает структуру вашего кода менее читаемой и менее явной. Таким образом, есть варианты определить ее явно со значениями по умолчанию или без них или использовать for_each, когда у вас есть несколько ресурсов для создания из списка / карты.
Комментарии:
1. > не думаю, что в настоящее время возможно «развернуть» карту внутри ресурса
health_check
не может быть больше ресурсов, у него может быть только один блок. Вот почему я не хочу использоватьfor_each