【问题标题】:Iterate through an object containing list of objects in Terraform遍历包含 Terraform 中对象列表的对象
【发布时间】:2020-12-27 23:25:34
【问题描述】:

这是我的变量定义:

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

【问题讨论】:

  • 生成的map(list(string)) 会涉及单个asset,还是聚合多个assets?根据类型规范,我必须假设每个 asset 有一个 house

标签: terraform


【解决方案1】:

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

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 }

}

【讨论】:

  • 是的,输出就是我需要的。但是我们可以在资源中(而不是输出)拥有它吗?
  • @highDopamine 我添加了新示例。可以的话可以去看看
  • 因为我使用了 for_each 值来遍历“assets”变量。所以我不能那样做。您可以在我的问题中看到我遍历“资产”变量的方式。我的问题是,在我遍历资源中的“资产”变量之后。如何遍历 each.value.house.rooms?
  • @highDopamine 遗憾的是我不知道assets 是什么。您没有提供任何资产变量示例。您列出的唯一内容是house
  • 你可以看到我的第一个代码块,有一个变量“assets”环绕着“房子”
猜你喜欢
  • 2022-01-04
  • 2019-08-08
  • 2010-12-07
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 2012-12-23
相关资源
最近更新 更多