遍历包含Terraform中对象列表的对象

时间:2020-09-09 13:52:43

标签: terraform

这是我的变量定义:

variable "assets" {
  type = map(object({
    car = object({
      name = string
      tires = list(string)
    })

    house = object({
      rooms = list(object({
        name = string
        furnitures = list(string)
      }))
    })
}

如果我输入以下内容:

assets {
  car = {
    name = "bmw"
    tires = ["1", "2", "3", "4"]
  }

  house = {
        rooms = [
          {
            name = "living_room"
            furnitures = ["chair, table"]
          },
          {
            name = "bed_room"
            furnitures = ["bed, pillow"]
          }
        ]
   }
}

在资源中,我遍历了资产值:

resource "test" "test" {
  for_each = {
    for asset in assets : asset.key => asset
  }
}

我想将包含对象列表( each.value.house.rooms )的对象提取到以下两个列表(在资源中):

room_names = ["living_room", "bed_room"]
room_furnitures = [["chair","table"], ["bed", "pillow"]]

我能想到的伪代码应该是:

room_names = for room in each.value.house.rooms: room.name
room_furnitures = for room in each.value.house.rooms: room.furnitures

1 个答案:

答案 0 :(得分:0)

不确定我是否正确理解了这个问题,但是您可以按照以下方式获得两个列表:

variable "house" {

  default = {
        rooms = [
          {
            name = "living_room"
            furnitures = ["chair, table"]
          },
          {
            name = "bed_room"
            furnitures = ["bed, pillow"]
          }
        ]
   }

}


locals {
  room_names = [for room in var.house.rooms : room["name"]]
  room_furnitures = [for room in var.house.rooms : room["furnitures"]]
}

output "room_names" {
  value = local.room_names
}

output "room_furnitures" {
  value = local.room_furnitures
}

输出为:

oom_furnitures = [
  [
    "chair, table",
  ],
  [
    "bed, pillow",
  ],
]
room_names = [
  "living_room",
  "bed_room",
]

在资源示例中

resource "test" "test" {
  for_each = {for idx, room in local.room_names : idx => room }

}