首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform列出对象映射每次迭代的键中的所有项。

Terraform列出对象映射每次迭代的键中的所有项。
EN

Stack Overflow用户
提问于 2022-08-05 17:41:14
回答 2查看 131关注 0票数 0

我有一张Terraform中的对象地图,用于网络列表如下:

代码语言:javascript
复制
networks = {
  "network1" = {
    subnet_names = ["subnet-1", "subnet-2", "subnet-3"]
  }
  "network2" = {
    subnet_names = ["subnet-4", "subnet-5", "subnet-6"]
  }

我希望创建6个网络安全组(每个子网1个)如下:

代码语言:javascript
复制
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”。有什么建议吗?谢谢。安德鲁。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-05 20:24:12

如果您想用splat表达式来解决这个问题:

代码语言:javascript
复制
resource "azurerm_network_security_group" "example" {
  for_each = toset(flatten(values(local.networks)[*].subnet_names))
[...]
}

解释:

  • 您需要values函数来创建一个数组,如下所示:

代码语言:javascript
复制
subnets = [
  {
    "subnet_names" = [
      "subnet-1",
      "subnet-2",
      "subnet-3",
    ]
  },
  {
    "subnet_names" = [
      "subnet-4",
      "subnet-5",
      "subnet-6",
    ]
  },
]

  • --您可以使用splat表达式只获取子网名称,但这将导致数组数组。您必须使用flatten来构建一个简单的数组.

此外,如果您将具有子网的其他属性,则此解决方案可以工作,例如:

代码语言:javascript
复制
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"
      # ...
    }
  }
}

输出:

代码语言:javascript
复制
output "subnets" {
  value = toset(flatten(values(local.networks)[*].subnet_names))
}
代码语言:javascript
复制
subnets = toset([
  "subnet-1",
  "subnet-2",
  "subnet-3",
  "subnet-4",
  "subnet-5",
  "subnet-6",
])
票数 1
EN

Stack Overflow用户

发布于 2022-08-05 18:33:33

这不应太复杂而无法实现。您应该使用内置的flatten函数,它将扁平所有列表并只返回一个列表:

代码语言:javascript
复制
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):

代码语言:javascript
复制
> local.flattened_networks
[
  "subnet-1",
  "subnet-2",
  "subnet-3",
  "subnet-4",
  "subnet-5",
  "subnet-6",
]

然后,您可以使用toset使其与for_each一起工作。

1

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73253524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档