Packer构建时无法通过-var-file传入变量,请求技术排查帮助
问题解决:Packer -var-file 传参失败的原因及修复方法
核心问题
你混淆了变量声明和变量赋值的文件作用:
.pkr.hcl(主构建文件或单独的变量声明文件)是用来声明变量的地方,必须通过variable块定义变量的类型、默认值等属性。.pkrvars.hcl/.pkrvars.json是用来赋值变量的文件,只能存放键值对,不能包含variable声明块。
你的主构建文件中直接使用了${var.foo},但从未声明过这个变量,这才是所有报错的根源——哪怕你用-var-file传了值,Packer也不知道这个变量的存在。
修复步骤
1. 补全变量声明
在主构建文件clean-null-build.pkr.hcl开头添加变量声明块,或者单独创建一个variables.pkr.hcl文件存放声明:
主构建文件修正后内容:
# 先声明变量 variable "foo" { type = string description = "测试变量" # 可选:如果需要默认值可以添加 default = "default-test" } source "null" "first" { communicator = "none" } build { name = "my first build" source "null.first" { } provisioner "shell-local" { inline = ["echo ${var.foo}"] } }
2. 正确编写变量赋值文件
根据格式选择一种即可:
HCL格式(variables.pkrvars.hcl):
foo = "test"JSON格式(variables.pkrvars.json):
{ "foo": "test" }
3. 执行构建命令
运行以下命令(对应你选择的赋值文件格式):
# HCL格式变量文件 packer build -var-file=variables.pkrvars.hcl clean-null-build.pkr.hcl # JSON格式变量文件 packer build -var-file=variables.pkrvars.json clean-null-build.pkr.hcl
你之前操作的错误解析
- 第一次将
variable块放在.pkrvars.hcl中:Packer会把该文件当作赋值文件处理,里面的variable声明是非法语法,直接报错。 - 第二次改成
foo="test"但未声明变量:Packer找不到foo变量的定义,因此报错"unknown variable"。 - 第三次用JSON格式赋值文件:同样因为主文件未声明
foo变量,Packer无法识别该变量,报错逻辑和第二次一致。
内容的提问来源于stack exchange,提问作者robotiaga
相关产品推荐
相关产品推荐

