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

时间:2019-10-09 14:28:33

标签: terraform terraform-provider-gcp

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

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

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

1 个答案:

答案 0 :(得分:2)

您在较早的示例中使用了name,但在最后一个示例中提到了区域,所以我不确定我是否完全理解您要在此处实现的目标,但是我将使用如果需要,可以使用region属性的name属性:

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

这是for expression,将您的对象列表投影到从区域到地址的地图中。 ...表达式后的addr.address符号表示您要分组依据 addr.region,因此这里的结果将是从字符串到字符串列表的映射,如您所愿。

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