我有一张Terraform中的对象地图,用于网络列表如下:
networks = {
"network1" = {
subnet_names = ["subnet-1", "subnet-2", "subnet-3"]
}
"network2" = {
subnet_names = ["subnet-4", "subnet-5", "subnet-6"]
}我希望创建6个网络安全组(每个子网1个)如下:
resource "azurerm_network_security_group" "example" {
for_each = toset(var.networks[*].subnet_names)
[...]
}然而,当我计划使用这段代码时,我会得到一个错误,即var_networks没有一个名为subnet_names的元素。我也尝试过几个for循环,但我想我可能需要在某个地方使用嵌套的for循环。我想要实现的是这样一个列表:nsgs_to_create=“子网-1”,“子网-2”,“子网-3”,“子网-4”,“子网-5”,“子网-6”。有什么建议吗?谢谢。安德鲁。
发布于 2022-08-05 20:24:12
如果您想用splat表达式来解决这个问题:
resource "azurerm_network_security_group" "example" {
for_each = toset(flatten(values(local.networks)[*].subnet_names))
[...]
}解释:
values函数来创建一个数组,如下所示:subnets = [
{
"subnet_names" = [
"subnet-1",
"subnet-2",
"subnet-3",
]
},
{
"subnet_names" = [
"subnet-4",
"subnet-5",
"subnet-6",
]
},
]flatten来构建一个简单的数组.此外,如果您将具有子网的其他属性,则此解决方案可以工作,例如:
locals {
networks = {
"network1" = {
subnet_names = ["subnet-1", "subnet-2", "subnet-3"]
cidr = "10.0.0.0/24"
# ...
}
"network2" = {
subnet_names = ["subnet-4", "subnet-5", "subnet-6"]
cidr = "10.0.1.0/24"
# ...
}
}
}输出:
output "subnets" {
value = toset(flatten(values(local.networks)[*].subnet_names))
}subnets = toset([
"subnet-1",
"subnet-2",
"subnet-3",
"subnet-4",
"subnet-5",
"subnet-6",
])发布于 2022-08-05 18:33:33
这不应太复杂而无法实现。您应该使用内置的flatten函数,它将扁平所有列表并只返回一个列表:
locals {
networks = {
"network1" = {
subnet_names = ["subnet-1", "subnet-2", "subnet-3"]
}
"network2" = {
subnet_names = ["subnet-4", "subnet-5", "subnet-6"]
}
}
flattened_networks = flatten([for k, v in local.networks: values(v) ])
}这将返回(使用terraform console):
> local.flattened_networks
[
"subnet-1",
"subnet-2",
"subnet-3",
"subnet-4",
"subnet-5",
"subnet-6",
]然后,您可以使用toset使其与for_each一起工作。
https://stackoverflow.com/questions/73253524
复制相似问题