Terraform:在输出文件中重新排列我的列表

Terraform: rearranging my lists in output file

我正在编写 Terraform 代码以在我们工作的每个区域中保留一些 IP 地址 google,稍后我将使用这些地址分配给几个特定实例。

所以在我的模块中我有一个

resource "google_compute_address" "reserved_public_ip" {
} 

迭代计数并记录项目、address_type、名称、区域、子网和地址。

所以我最终得到 google_compute_address.reserved_public_ip 数组。我可以轻松地列出所有名称和 ip 地址

output "public_reservedip" {
  value = "${zipmap(
    google_compute_address.reserved_public_ip.*.name,
    google_compute_address.reserved_public_ip.*.address
  )}"
}

但是我无法使用 *.region 使用 zipmap 制作 region->ipaddress 的地图,因为每个区域有 3 个 ip,所以我只会得到最后一个 ip 地址,因为区域键重复。

我要构建的是表单的输出

value = {
   region1 = [list of ips]
   region2 = [list of ips]
   etc...
}

所以我可以将其提供给创建适当 gcp 主机的模块,它可以获取当前正在创建的区域的列表,但我无法弄清楚允许我这样做的转换。

我必须使用的示例数据:

module.gcp-network.google_compute_address.reserved_public_ip.0:
  id = myproject/northamerica-northeast1/dns-reserve-1-test
  address = 10.128.0.2
  address_type = INTERNAL
  creation_timestamp = 2019-10-08T15:41:08.690-07:00
  description =
  name = dns-reserve-1-test
  network_tier = PREMIUM
  project = myproject
  purpose = GCE_ENDPOINT
  region = northamerica-northeast1
  self_link = https://www.googleapis.com/compute/v1/projects/myproject/regions/northamerica-northeast1/addresses/dns-reserve-1-test
  subnetwork = https://www.googleapis.com/compute/v1/projects/myproject/regions/northamerica-northeast1/subnetworks/test-northamerica-northeast1-public-subnet
  users.# = 0

你在前面的例子中使用了 name 但在最后一个例子中提到了区域,所以我不确定我是否完全理解你在这里试图实现的目标但我将举一个例子如果您需要,则使用适用于 nameregion 属性:

  value = {
    for addr in google_compute_address.reserved_public_ip : addr.region => addr.address...
  }

这是一个 for expression 将您的对象列表投影到从区域到地址的地图中。 addr.address表达式后面的...符号表示要group byaddr.region,所以这里的结果会是一个字符串到列表的映射字符串,如你所愿。

这是 Terraform 0.12 的一项功能。 Terraform 0.11 中没有等效功能。