Terraform local-exec执行Packer多行脚本报错:找不到配置文件
问题
我正尝试创建VMSS,计划用Packer打包镜像,Terraform部署剩余Azure基础设施。本地测试阶段执行terraform apply时触发以下错误:
Error: local-exec provisioner error │ │ with null_resource.packer, │ on main.tf line 14, in resource "null_resource" "packer": │ 14: provisioner "local-exec" { │ │ Error running command 'packer build \ │ -var client_id=[client] \ │ -var client_secret=[secret] \ │ -var install_password=CHANGEME! \ │ -var location=UKSOUTH \ │ -var resource_group=[resourcegroup] \ │ -var storage_account=[sa] \ │ -var subscription_id=[sub] \ │ -var temp_resource_group_name=rg-packerbuild-test \ │ -var tenant_id=[tenant] \ │ -var virtual_network_name=[vnet] \ │ -var virtual_network_resource_group_name=[resource group] \ │ -var virtual_network_subnet_name=hosts \ │ windows2022.pkr.json │ ': exit status 1. Output: Error: Could not find any config file in \ │ │ A config file must be suffixed with `.pkr.hcl` or `.pkr.json`. A folder can be │ referenced.
对应的Terraform代码如下:
locals { ami_name = join("-", [var.name, formatdate("YYYYMMDDhhmmss", timestamp())]) } resource "null_resource" "packer" { triggers = { ami_name = local.ami_name } provisioner "local-exec" { working_dir = path.module command = <<-EOF packer build \ -var client_id=${var.client_id} \ -var client_secret=${var.client_secret} \ -var install_password=${var.install_password} \ -var location=${var.location} \ -var resource_group=${var.resource_group} \ -var storage_account=${var.storage_account} \ -var subscription_id=${var.SubscriptionId} \ -var temp_resource_group_name=${var.TempResourceGroupName} \ -var tenant_id=${var.TenantId} \ -var virtual_network_name=${var.VirtualNetworkName} \ -var virtual_network_resource_group_name=${var.VirtualNetworkRG} \ -var virtual_network_subnet_name=${var.VirtualNetworkSubnet} \ windows2022.pkr.json EOF } }
已确认windows2022.pkr.json文件存在,在packer build前加dir命令也能显示正确路径,请问哪里操作有误?
排查与解决
- 删除文件名后的多余空格:你的Terraform代码里,
windows2022.pkr.json这行末尾有个空格,EOF会保留这个空格,导致实际执行的命令中文件名变成windows2022.pkr.json(带尾空格),系统无法识别这个文件。把该行末尾的空格删掉即可。 - 使用绝对路径指定配置文件:虽然设置了
working_dir = path.module,可以尝试将文件名替换为绝对路径:${path.module}/windows2022.pkr.json,避免路径解析时的歧义。 - 验证最终执行的命令:可以在
local-exec中先把命令输出到临时文件,比如在packer build前添加echo "packer build ..." > debug_cmd.txt,查看实际生成的命令是否存在格式问题,比如变量注入导致的路径异常。 - 检查Packer版本:确保使用的Packer版本支持
.pkr.json格式配置,虽然后缀符合要求,但部分旧版本可能对JSON配置的兼容有差异,尝试升级到稳定版Packer再测试。
内容的提问来源于stack exchange,提问作者joko_88
相关产品推荐
相关产品推荐

