在Terraform v0.12.6中使用 for_each 表达式动态生成vnet子网的内联块(Azure)。我定义了列表变量“子网”,其中两个子网分别为“ sub1”和“ sub2”
variable "subnets" {
default = [
{
name = "sub1"
prefix = "1.1.1.1/32"
},
{
name = "sub2"
prefix = "2.2.2.2/32"
},
]
}
然后遍历“ azurerm_virtual_network”块中的列表变量以创建动态子网块
dynamic "subnet" {
for_each = [for s in var.subnets : {
name = s.name
prefix = s.prefix
}]
content {
name = subnet.name
address_prefix = subnet.prefix
}
}
}
第一个是错误:属性不受支持
在main.tf第42行的资源“ azurerm_virtual_network”“ vnet”中: 42:名称= subnet.name
该对象没有名为“ name”的属性。
答案 0 :(得分:1)
为dynamic
块创建的迭代器对象具有两个属性:
key
:当前元素的地图关键字或列表索引value
:当前元素的值在这种情况下,用于重复的集合是对象列表,因此subnet.key
将是整数索引0、1,...,而subnet.value
将是与该索引关联的对象
要获得所需的结果,您需要访问subnet.value
上的对象属性:
dynamic "subnet" {
for_each = [for s in var.subnets : {
name = s.name
prefix = s.prefix
}]
content {
name = subnet.value.name
address_prefix = subnet.value.prefix
}
}
}
似乎var.subnets
已经与content
块期望的对象结构兼容,因此可以通过直接访问它来进一步简化它:
dynamic "subnet" {
for_each = var.subnets
content {
name = subnet.value.name
address_prefix = subnet.value.prefix
}
}
}
只要var.subnets
已经是对象列表,则应该产生相同的结果。