gpt4 book ai didi

azure - Terraform 列出对象映射的每次迭代的键中的所有项目

转载 作者:行者123 更新时间:2023-12-03 05:19:38 25 4
gpt4 key购买 nike

我在 Terraform 中有一张网络列表的对象 map ,如下所示:

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”]]然后我可以使用它为每个子网创建 NSG。有什么建议么?谢谢。安德鲁。

最佳答案

如果你想用 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",
]
},
]
  • 您可以使用 splat 表达式仅获取子网名称,但这将生成一个数组数组。您必须使用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",
])

关于azure - Terraform 列出对象映射的每次迭代的键中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73253524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com