我正在编写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
答案 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中没有等效功能。