Terraform 连接子列表

Terraform concatenate sublists

我想从对象列表的子列表中获取组合列表。

我有一个像这样的列表对象:

users: [
  {
    name: "a"
    cars: [
      "z1",
      "z2"
    ]
  },
  {
    name: "b"
    cars: [
      "x1",
      "x2"
    ]
  }
]

结果应该是:

cars = ["z1", "z2", "x1", "x2"]

主要原因是我需要在每个元素上执行resource:

resource "some_resource" "some_resource_name" {
  for_each = var.cars
  car_name = each.value
}

要是能直接在资源里做就完美了。或者,如果我需要在本地人中预先构建列表,那也不是问题。 我该怎么做?

local {
  cars = flatten([
    for user, cars in var.users : [
      for car in cars: {
        user = user
        car  = car
      }
    ]
  ])
}

不会产生完美的结果,但它是一个可行的解决方案 结果将是:

[
  {
    user = "a",
    car = "z1"
  },
  {
    user = "a",
    car = "z2"
  },
  {
    user = "b",
    car = "x1"
  },
  {
    user = "b",
    car = "x2"
  }
]

这可以通过组合 splat expression with flatten 函数轻松实现:

locals {
  cars = flatten([
    var.users[*].cars
  ])
}

其他解决方案是使用 for 表达式:

locals {
  cars = flatten([
    for user in var.users: user.cars
  ])
}

在这两种情况下 cars 的结果将是:

cars = [
  "z1",
  "z2",
  "x1",
  "x2",
]