Terraform新手调用GCP VM模块执行plan提示变量未声明如何解决
报错核心原因
你在根模块的main.tf中使用了var.project_id引用变量,但没有在根模块下声明这个变量,Terraform 要求所有以var.xxx格式引用的输入变量,必须先在当前模块中通过variable "xxx" {}块完成声明,和子模块配置、tfvars赋值文件没有直接关联。
Terraform 变量作用域规则
你混淆了三个不同场景的变量用途,按规则区分如下:
- 子模块内声明的变量:是子模块对外暴露的入参,仅用于调用模块时传值,不需要在根模块重复声明
- 根模块声明的变量:你在根目录任意
.tf文件(通常命名为variables.tf)中声明的变量,才可以通过var.xxx在根模块的配置中引用 .tfvars文件:仅能为已经在根模块完成声明的变量赋值,未声明的变量即使写在tfvars中也不会被识别,还会触发未使用变量的警告
具体解决步骤
- 在你存放
main.tf的根模块目录下,新建variables.tf文件,添加你用到的所有变量声明,示例如下:
variable "project_id" { type = string description = "GCP 项目唯一ID" } # 其他你用到的自定义变量也按这个格式补充声明 variable "region" { type = string description = "GCP 资源部署区域" default = "us-central1" # 可设置默认值,tfvars未赋值时会默认取用 } variable "zone" { type = string description = "GCP 资源部署可用区" default = "us-central1-a" }
- 确认你已在
var.tfvars文件中配置了project_id = "你的实际GCP项目ID"对应赋值 - 执行
terraform plan时如果你的变量文件不是默认的terraform.tfvars命名,需要显式指定变量文件路径:terraform plan -var-file=var.tfvars
常见疑问说明
变量声明位置规则:
- 哪个模块要用到
var.xxx格式的变量,就必须在哪个模块内完成声明,和其他模块无关 - 调用第三方子模块时,仅需要在调用块中直接传入对应参数即可,参数是子模块已经声明好的,不需要你在根模块重复声明
内容的提问来源于stack exchange,提问作者Thomas AUBUGEAU
相关产品推荐
相关产品推荐

