Terraform如何按条件覆写带默认值的模块变量且不破坏封装
解决方案
最优方案(Terraform v0.14+ 原生支持,零额外改造)
Terraform 原生支持 null 值语义:当你给模块输入参数传递 null 时,Terraform 会判定该参数未被显式传入,自动使用模块侧定义的默认值,既不需要调用方感知模块内部默认值,也不需要修改模块原有逻辑,完全满足封装要求。
修改后的调用侧代码如下:
main.tf
terraform { required_version = ">= 0.14.9" } variable "random" { type = number } module "my_animal_module" { source = "./my-animal-module" # 条件为真时传覆写值,为假时传null自动使用模块默认值 species = var.random > 7 ? "monkey" : null }
模块侧代码无需任何改动,符合封装要求:
- 当
var.random > 7时,species参数传入值monkey,覆盖模块默认值 - 当
var.random <=7时,species等效于未传入,直接使用模块定义的默认值horse
多参数动态传参方案(类dynamic blocks效果)
如果需要批量控制多个参数是否传入,可以配合merge函数和参数展开语法实现批量动态传参,不需要单独给每个参数写条件判断:
locals { # 条件满足时生成包含所有需要覆写的参数的对象,不满足时返回空对象 override_args = var.enable_override ? { species = "monkey" count = 3 habitat = "forest" } : {} } module "my_animal_module" { source = "./my-animal-module" # 合并默认空对象和动态覆写参数,展开后传入模块 merge({}, local.override_args)... }
内容的提问来源于stack exchange,提问作者spinkus
相关产品推荐
相关产品推荐

