Terraform从map对象提取指定值失败,仅需获取name字段
解决方案
你可以通过for表达式直接提取每个子对象的name字段,同时保留原var.host_svc的map结构不变,用于其他需要完整对象的场景。
修改后的Terraform主文件示例
locals { # 提取name字段的列表,保持原reverse顺序 services_names = reverse([for svc in values(var.host_svc) : svc.name]) # 保留原有的完整对象列表(如果仍需要的话) services_list = reverse(values(var.host_svc)) } variable "host_svc" { type = map(map(any)) } output "service_names" { value = local.services_names } # 保留原输出用于验证完整对象(可选) output "full_services" { value = local.services_list }
关键说明
- 保留原map结构:
var.host_svc依然是你定义的map(map(any))类型,完全可以在其他资源或模块中直接使用,比如引用var.host_svc.accounts.pod获取实例数。 - 提取name字段:通过
[for svc in values(var.host_svc) : svc.name]遍历所有子对象,只取出name属性,再用reverse()保持你原来的顺序要求。 - 冗余代码清理:你原来的
flatten()是多余的,因为values(var.host_svc)返回的已经是一维列表,reverse()后依然是一维,不需要扁平化。
输出结果
应用上述代码后,service_names输出会是:
[ "analytics", "accounts" ]
而var.host_svc可以继续用于其他场景,比如:
# 示例:使用原map中的pod配置 resource "some_resource" "example" { for_each = var.host_svc replicas = each.value.pod }
内容的提问来源于stack exchange,提问作者Hamza Ali
相关产品推荐
相关产品推荐

