现在我正在迁移到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
}
或者什么的。
我知道你要去哪里了。但我认为目前不可能";展开";例如,资源中的地图。您可以用默认值定义映射变量,尽管这需要更多的代码行。
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。