如何在Terraform中实现按GCP Region分组的预留IP列表输出?
解决Terraform中按区域分组预留IP的问题
我完全懂你现在的困扰——用zipmap拿区域当键的话,同一个区域下的多个IP会被覆盖,最后只能保留每个区域的最后一个IP,根本没法实现「区域对应IP列表」的映射结构。别担心,用Terraform的for表达式配合distinct函数就能轻松搞定这个需求!
具体实现代码
直接替换你原来的output块,改成下面这样:
output "public_reservedip_by_region" { value = { # 先提取所有唯一的区域名称 for region in distinct(google_compute_address.reserved_public_ip.*.region) : # 为每个区域匹配对应的所有IP地址,组成列表 region => [ for ip in google_compute_address.reserved_public_ip : ip.address if ip.region == region ] } description = "按区域分组的预留IP地址列表,结构为 {region_name = [ip1, ip2, ip3]}" }
代码逻辑解释
distinct(google_compute_address.reserved_public_ip.*.region):先从所有预留IP资源中提取出不重复的区域名称,避免重复处理同一个区域。- 外层
for循环:遍历每个唯一区域,把区域名称作为映射的键。 - 内层
for循环:筛选出当前区域下的所有预留IP地址,组成一个列表作为对应键的值。
这样输出的结构就完全符合你想要的{region1 = [IP列表], region2 = [IP列表]}格式了!
在主机模块中使用这个映射
当你调用创建GCP主机的模块时,可以直接根据当前模块的区域参数,从这个映射中取出对应的IP列表:
module "gce_hosts" { source = "./path-to-your-gce-module" # 假设你的主机模块有region参数和reserved_ips参数 region = "northamerica-northeast1" reserved_ips = module.gcp-network.public_reservedip_by_region["northamerica-northeast1"] # 其他必要参数... }
如果你的主机模块是跨多个区域部署的,也可以把整个public_reservedip_by_region映射传递进去,让模块内部根据自身的region参数去匹配对应的IP列表。
针对你的示例数据的输出效果
以你提供的示例数据为例,假设northamerica-northeast1区域还有另外两个预留IP(比如10.128.0.3和10.128.0.4),那么输出的结构会是:
{ "northamerica-northeast1" = [ "10.128.0.2", "10.128.0.3", "10.128.0.4", ] }
内容的提问来源于stack exchange,提问作者Ron Jarrell
相关产品推荐
相关产品推荐

