Terraform如何处理JSON缺失的permissions属性并赋值空列表
解决Terraform解析JSON时的权限字段赋值与Map转换错误
问题分析
核心问题有两个:
- 部分JSON对象缺失
permissions属性,需自动赋值空列表 - 转换为map时触发类型错误,根源是列表中对象结构不一致(部分含
permissions,部分不含)
解决方案
1. 统一对象结构,处理permissions字段缺失
在构造local.folders时,确保每个对象都包含permissions字段,用try函数处理属性缺失场景:
locals { default_folders = jsondecode(file("${path.module}/folders.json")) folders = flatten([ for datacenter_key, datacenter in var.datacenters : [ for folder_key, folder in local.default_folders : { datacenter_key = datacenter_key datacenter_moid = datacenter.datacenter_moid name = folder_key type = folder.type permissions = try(folder.permissions, tolist([])) # 关键修复:保证所有对象都有permissions字段 } ] ]) }
try(folder.permissions, tolist([]))的作用:
- 若
folder.permissions存在且为列表类型,直接使用原值 - 若
folder.permissions不存在或为null,返回空列表[],确保所有对象结构完全一致
2. 修复Map转换的类型错误
当local.folders中所有对象结构统一后,map转换操作即可正常执行,因为所有value的类型已对齐:
resource "vsphere_folder" "folder" { for_each = tomap({ for folder in local.folders : "${folder.datacenter_moid}.${folder.name}" => folder }) datacenter_id = each.value.datacenter_moid path = each.value.name type = each.value.type # 后续若需使用权限字段,可直接引用each.value.permissions }
错误原因说明
之前的tomap报错,是因为local.folders中的对象结构不统一:部分对象有permissions字段,部分没有。Terraform要求map的所有value必须是同一类型的对象,结构不一致会导致类型推断失败。统一添加permissions字段后,所有对象结构完全相同,类型推断通过,tomap即可正常转换。
内容的提问来源于stack exchange,提问作者user438431
相关产品推荐
相关产品推荐

