如何在Terraform 1.0.0中实现模块条件执行与参数动态传递
Terraform 条件选择模块+动态传参实现方案
步骤1:定义输入变量
先创建variables.tf文件,声明输入参数并增加合法性校验:
variable "region" { type = string description = "AWS区域" } variable "module_name" { type = string description = "要执行的模块名称,可选值:CreateResource1、CreateResource2" validation { condition = contains(["CreateResource1", "CreateResource2"], var.module_name) error_message = "module_name仅支持传入CreateResource1或CreateResource2" } } variable "parameters" { type = map(any) description = "传递给目标模块的参数字典" }
步骤2:改造main.tf实现条件执行和动态传参
利用Terraform的count参数实现模块的条件启停,利用map参数展开语法实现动态传参:
provider "aws" { region = var.region } module "CreateResource1" { count = var.module_name == "CreateResource1" ? 1 : 0 source = "./modules/CreateResource1" // 自动展开parameters的键值对作为模块的输入参数 var.parameters... } module "CreateResource2" { count = var.module_name == "CreateResource2" ? 1 : 0 source = "./modules/CreateResource2" // 自动展开parameters的键值对作为模块的输入参数 var.parameters... }
调用示例
你可以按照需求传入参数调用:
module "Resource" { source = "./当前根模块的本地路径" module_name = "CreateResource1" parameters = { ProductName = "Test1" ProductColour = "Red" ProductShape = "Hexagone" } }
注意事项
- 传入的
parameters的键名、数据类型必须和目标模块的输入参数完全匹配,否则会触发参数校验错误 - 由于使用了
count做条件控制,模块的输出会变为列表类型,引用模块输出时需要增加索引,例如:module.CreateResource1[0].输出参数名 - 上述语法完全兼容Terraform 1.0及以上版本,无需开启额外特性开关
内容的提问来源于stack exchange,提问作者Mahi
相关产品推荐
相关产品推荐

