如何在HCL2中正确配置Packer变量?报错问题求助
问题场景
主构建文件build.pck.hcl中引用变量:
... client_id = var.client_id ...
创建account.pkr.hcl存放变量声明:
variable "client_id" { type = string }
执行命令:
packer build -color=false -debug -var "client_id=123" -var-file account.pkr.hcl build.pck.hcl
触发报错:
Error: Variable declaration in a .pkrvar file
on account.pkr.hcl line 14, in variable "client_id":
14: variable "client_id" {A .pkrvar file is used to assign values to variables that have already been
declared in .pkr files, not to declare new variables. To declare variable
"client_id", place this block in one of your .pkr files, such as
variables.pkr.hclTo set a value for this variable in account.pkr.hcl, use the definition syntax
instead:
client_id =
另外,若命令中传入文件所在文件夹路径,会触发:
Error: Undefined -var variable
A "client_id" variable was passed in the command line but was not found in known
variables. To declare variable "client_id", place this block in one of your .pkr
files, such as variables.pkr.hcl
修复方案
1. 明确区分变量声明与变量赋值文件
Packer对两类文件有严格区分:
- 变量声明文件:后缀为
.pkr.hcl,用来定义变量的类型、默认值等,Packer会自动扫描加载同目录下的这类文件,不需要通过-var-file指定。 - 变量赋值文件:后缀为
.pkrvars.hcl,用来给已声明的变量赋值,需要通过-var-file传入。
2. 调整文件结构与命令
步骤1:整理变量声明文件
保留account.pkr.hcl作为变量声明文件,可添加默认值(命令行传入的值会覆盖默认值):
# account.pkr.hcl variable "client_id" { type = string # 可选:设置默认值 default = "default_client_id" } # 可在此添加其他变量声明 variable "region" { type = string default = "us-east-1" }
步骤2:批量赋值用变量赋值文件
如果需要批量传入变量值,创建account.pkrvars.hcl(注意后缀为pkrvars.hcl):
# account.pkrvars.hcl client_id = "predefined_client_id" region = "eu-west-1"
步骤3:执行正确的build命令
- 仅命令行传变量:
packer build -color=false -debug -var "client_id=123" build.pck.hcl
- 结合变量赋值文件:
packer build -color=false -debug -var "client_id=123" -var-file account.pkrvars.hcl build.pck.hcl
(Packer会自动加载同目录下的account.pkr.hcl声明文件,无需手动传入)
3. 解决文件夹路径传入的报错
当命令指定文件夹路径时,确保变量声明文件(.pkr.hcl)在该文件夹内,Packer会自动扫描加载。例如:
# 假设所有文件在./packer-config目录下 packer build -color=false -debug -var "client_id=123" ./packer-config
内容的提问来源于stack exchange,提问作者Alex F

