Terraform模块共享common/variables.tf失败,报错未声明变量
Terraform共享通用变量报错原因及解决
问题根源
Terraform的变量是模块级隔离的:
/common/variables.tf里的var.gcp_project是common模块的输入变量,仅在该模块内部生效,根模块tut无法直接识别这个变量。- 当你在
tut/main.tf里调用module "common"并传递var.gcp_project时,Terraform会去tut模块的上下文查找该变量,但tut未声明,因此触发报错。 - 复制
variables.tf到tut能运行,是因为此时tut模块自身有了变量定义,和common模块的变量只是同名,本质是两个独立的模块变量。
正确的共享方案
1. 符号链接复用变量定义(最简单)
无需复制文件,直接给tut目录创建指向common/variables.tf的软链接,实现变量定义共享:
cd tut ln -s ../common/variables.tf variables.tf
这样tut和common共用同一个变量定义文件,修改一处即可同步所有模块,完全符合共享需求。
2. 封装通用变量模块(更规范)
把通用变量做成独立模块,让所有业务模块依赖它:
- 在
common/main.tf里输出变量:
output "gcp_project" { value = var.gcp_project }
- 在
tut目录复用common的变量定义(可通过软链接避免重复编写):
# 直接用软链接指向common/variables.tf,或复制其内容 variable "gcp_project" { type = string description = "GCP项目ID" }
- 在
tut/main.tf里调用common模块,后续新增模块直接复用其输出:
module "common" { source = "../common" gcp_project = var.gcp_project } # 其他模块无需重复声明变量,直接用common的输出 module "new_module" { source = "../new_module" gcp_project = module.common.gcp_project }
3. 根目录共享变量文件(共享取值)
如果仅需共享变量的具体取值,在项目根目录创建terraform.tfvars:
gcp_project = "your-project-id"
然后在tut目录执行命令时指定该文件:
terraform plan -var-file="../terraform.tfvars"
注:这种方式仍需每个模块自行声明变量定义。
内容的提问来源于stack exchange,提问作者piotrlg
相关产品推荐
相关产品推荐

