Terraform 如何筛选列表中符合指定条件的对象?
解决方案
你可以用Terraform原生的for表达式实现集合过滤,也可以搭配groupby函数直接完成分组,两种实现方案如下:
方案1:单独输出dev、prd对应的子列表
适配你给出的列表结构,过滤逻辑如下:
# 输出所有dev集群的服务 output "sublist_dev" { value = [ for svc_obj in var.kubernetes : svc_obj if values(svc_obj)[0].cluster == "dev" ] } # 输出所有prd集群的服务 output "sublist_prd" { value = [ for svc_obj in var.kubernetes : svc_obj if values(svc_obj)[0].cluster == "prd" ] }
方案2:一次性按cluster值分组
如果希望更灵活的调用,可直接生成按cluster分组的map,后续需要某类集群的服务时直接取对应key的值即可:
output "kubernetes_by_cluster" { value = groupby( [for svc_obj in var.kubernetes : values(svc_obj)[0].cluster => svc_obj] ) }
该输出的结构为:
{ "dev" = [dev集群的所有服务对象列表], "prd" = [prd集群的所有服务对象列表] }
后续调用时直接使用kubernetes_by_cluster.dev、kubernetes_by_cluster.prd即可拿到对应分组的列表。
注:如果你的列表结构后续调整为服务名直接作为对象属性、而非单key对象,过滤条件可以简化为if svc.cluster == "目标值",当前写法完全适配你给出的示例结构。
内容的提问来源于stack exchange,提问作者jarobar435
相关产品推荐
相关产品推荐

