首页 > 解决方案 > Terraform:如何从列表中的嵌套地图列表中选择一个值?

问题描述

所以在下面我有子网,它是主 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
            }
          ]
        }
      ]
    }
  ]
}

标签: azureterraform

解决方案


您可以使用以下内容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",
  ]
}


推荐阅读