【问题标题】:Terraform: How to select a value from a nested list of maps within a list?Terraform:如何从列表中的嵌套地图列表中选择一个值?
【发布时间】:2021-03-02 06:49:14
【问题描述】:

所以在下面我有子网,它是主 vnet 列表中的映射列表。如果我正在为 azure 创建子网资源,如何提取每个资源的子网名称?如果我要更深一层,我将如何提取 SG 名称?

variable "vnets" {
  default = [
    {
      vnet_name     = "test-vnet"
      address_space = "10.250.0.0"
      network_size  = 16
      subnets = [
        {
          name                     = "first-subnet"
          network_security_group   = "first-nsg"
          security_group_rules = [
            {
              name                       = "first-sg"
              priority                   = 100
            }
          ]
        },
        {
          name                     = "second-subnet"
          network_security_group   = "second-nsg"
          security_group_rules = [
            {
              name                       = "second-sg"
              priority                   = 100
            }
          ]
        }
      ]
    }
  ]
}

【问题讨论】:

  • 您能发布到目前为止您尝试了什么吗?你读过这个stackoverflow.com/questions/52119400/…吗?
  • 是的,已经读过了,但这无助于尝试从嵌套的地图列表中读取值。它目前对我来说是一个障碍,我尝试除了地图列表之外的任何东西,我知道它适用于 count 变量然后查找。但是,一旦我添加了嵌套的地图列表,我什至不知道从哪里开始。我将计数设置为 var.vnets 还是 var.vnets.subnets?

标签: azure terraform


【解决方案1】:

您可以使用以下locals 获取子网名称和安全组名称:

locals {

   subnet_names = flatten(var.vnets[*].subnets[*].name)
   
   subnet_names_with_vnet_name = { 
         for vnet in var.vnets[*]:
           (vnet.vnet_name) =>  vnet.subnets[*].name
   }
   
   security_group_names = flatten(var.vnets[*].subnets[*].security_group_rules[*].name)

}

output "subnet_names" {
  value = local.subnet_names
}

output "subnet_names_with_vnet_name" {
  value = local.subnet_names_with_vnet_name
}

output "security_group_names" {
  value = local.security_group_names
}

导致:

security_group_names = [
  "first-sg",
  "second-sg",
]
subnet_names = [
  "first-subnet",
  "second-subnet",
]
subnet_names_with_vnet_name = {
  "test-vnet" = [
    "first-subnet",
    "second-subnet",
  ]
}

【讨论】:

  • 我应该把这个“本地人”放在资源块里面还是外面?
  • @shan 你把它放在外面了。它是它自己的块,如variable 块。
  • vnet.vnet 指的是什么?目前对我抛出一个错误,说对象没有属性
  • @shan 应该是vnet.vnet_name。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2015-07-02
相关资源
最近更新 更多