Terraform对象型变量如何设置部分属性默认值?
解决Terraform对象变量仅传部分属性的问题
当你定义的object类型变量要求必须传入所有属性,但希望只传部分属性时自动继承默认值,有两种可行方案:
方案1:使用可选属性(Terraform 0.14+)
Terraform 0.14及以上版本支持给object类型的属性添加optional()修饰符,标记该属性为非必填,未传入时会自动使用默认值中的对应属性。
修改后的变量定义:
variable "var_a" { type = object({ name = string enabled = optional(bool) }) default = { name = "the_name" enabled = true } }
此时传入var_a = { name = "another_name" },enabled会自动沿用默认值true,不会触发必填属性报错。
方案2:局部值合并(兼容旧版本)
如果使用的Terraform版本低于0.14,可以通过局部值(local)将用户传入的变量与默认值合并,优先使用用户传入的属性,未传入的则取默认值。
示例代码:
# 允许传入任意子集属性,默认空map variable "var_a" { type = map(any) default = {} } # 合并默认值与用户传入值 locals { var_a_final = merge( { name = "the_name" enabled = true }, var.var_a ) }
后续代码中直接使用local.var_a_final.name和local.var_a_final.enabled即可。如果需要保留严格类型检查,可将变量类型改为object({ name = string, enabled = bool })并设置默认值为空,再通过合并后做类型转换,但这种方式稍显繁琐,优先推荐方案1。
内容的提问来源于stack exchange,提问作者dingo
相关产品推荐
相关产品推荐

