Terraform为map(object)变量设置默认值调用模块报错如何解决
你当前的配置存在两个核心问题:
- Terraform
object类型的属性默认全部为必填项,你在变量块中定义的default是整个virtual_servers变量的全局默认值(仅当调用模块时完全不传该变量才会生效),不能用来补全单个对象中缺失的属性。 - 调用模块时参数名错误,模块定义的变量名为
virtual_servers,你实际传的是virtual_servers_1,相当于没有给目标变量传值。
修复方案
步骤1:修改模块侧变量定义,标记可选属性
使用 Terraform 内置的 optional() 修饰符标记非必填属性,该特性在 Terraform 0.14 及以上版本支持:
variable "virtual_servers" { type = map(object({ port = optional(number, 1) fwd_zone = optional(string, "test") rev_zone = optional(string, "test") source_address_translation = optional(string, "test") irules = optional(list(string), []) profiles = optional(list(string), []) client_profiles = optional(list(string), []) server_profiles = optional(list(string), []) })) # 全局默认值仅在完全不传该变量时生效,可根据需要保留或删除 default = {} }
步骤2:模块侧增加默认值合并逻辑(可选,兼容更复杂的合并场景)
如果需要更灵活的默认值管理,可以在模块 main.tf 中新增局部值做属性合并,避免所有默认值都堆在变量定义里:
locals { # 统一定义虚拟服务器默认配置 default_virtual_server = { port = 1 fwd_zone = "test" rev_zone = "test" source_address_translation = "test" irules = [] profiles = [] client_profiles = [] server_profiles = [] } # 遍历用户传入的配置,和默认值合并补全缺失属性 virtual_servers = { for k, cfg in var.virtual_servers : k => merge(local.default_virtual_server, cfg) } } # 资源引用时使用合并后的局部值 resource "virtual_server" "this" { for_each = local.virtual_servers port = each.value.port source_address_translation = each.value.source_address_translation irules = each.value.irules profiles = each.value.profiles client_profiles = each.value.client_profiles server_profiles = each.value.server_profiles }
步骤3:修正调用侧参数名
把传入的参数名改为模块定义的 virtual_servers:
module "module_name" { source = "module_source" virtual_servers = { "name" = { port = 80 fwd_zone = "override" } "virtual_servers_2" = { port = 80 fwd_zone = "override" } } }
修改完成后,调用模块时只需要传入需要覆盖的属性,剩余属性会自动使用默认值填充,不会再报属性缺失的错误。
内容的提问来源于stack exchange,提问作者HLT
相关产品推荐
相关产品推荐

