Terraform环境级tfvars配置及多模块变量传递最佳实践咨询
Terraform 多环境 tfvars 与变量传递最佳实践
一、调整项目结构(添加 tfvars 文件)
直接在每个环境目录下新增环境专属的 terraform.tfvars 文件,最终结构如下:
├── modules │ ├── adf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── variables.tf # 定义模块所需变量(如tags) │ └── storage │ ├── main.tf │ ├── outputs.tf │ ├── variables.tf # 同样定义模块级变量 ├── dev │ ├── main.tf │ ├── provider.tf │ ├── variables.tf # 定义环境级变量 │ └── terraform.tfvars # dev环境变量赋值 └── prod ├── main.tf ├── provider.tf ├── variables.tf # 定义环境级变量 └── terraform.tfvars # prod环境变量赋值
二、变量传递实现步骤
1. 模块层:定义通用变量
在每个模块的 variables.tf 中声明需要外部传入的变量(比如tags),保证模块的通用性,不绑定具体环境值:
# modules/adf/variables.tf variable "tags" { type = map(string) description = "资源通用标签,用于标识环境、归属等信息" }
然后在模块的 main.tf 中引用该变量,例如给资源添加标签:
# modules/adf/main.tf resource "azurerm_data_factory" "example" { # 其他配置... tags = var.tags }
2. 环境层:统一管理环境变量
在每个环境的 variables.tf 中定义环境级的通用变量,作为模块变量的入口:
# dev/variables.tf variable "common_tags" { type = map(string) description = "dev环境下所有资源的通用标签集合" }
接着在环境的 main.tf 中,将环境变量统一传递给所有模块:
# dev/main.tf module "adf" { source = "../modules/adf" tags = var.common_tags } module "storage" { source = "../modules/storage" tags = var.common_tags }
3. tfvars 文件:赋值环境专属值
在每个环境的 terraform.tfvars 中填写该环境的具体变量值,比如不同的tags:
# dev/terraform.tfvars common_tags = { Environment = "dev" Project = "my-data-platform" Owner = "dev-team" }
# prod/terraform.tfvars common_tags = { Environment = "prod" Project = "my-data-platform" Owner = "prod-team" SLA = "99.99%" }
4. 执行命令
进入对应环境目录执行Terraform命令即可,系统会自动加载目录下的 terraform.tfvars:
# 进入dev目录执行 cd dev terraform init terraform plan terraform apply
三、核心最佳实践总结
- 环境隔离:每个环境目录独立维护tfvars,避免不同环境的变量值互相干扰,生产环境更安全。
- 模块复用:模块只定义变量接口,不硬编码环境值,同一模块可在dev、prod等环境复用。
- 统一传递:通过环境级变量统一向所有模块传递通用属性(如tags),确保同一环境下资源标识一致。
- 默认加载:使用
terraform.tfvars作为文件名,执行命令时无需额外指定参数,简化操作。
内容的提问来源于stack exchange,提问作者Fisqkuz
相关产品推荐
相关产品推荐

