PowerShell调用Packer传递azure_tags变量时遇错求助
问题:Packer传递map类型变量报错处理
在某仓库的ubuntu2204.pkr.hcl脚本中定义了如下map类型变量:
variable "azure_tags" { type = map(string) default = {} }
我通过PowerShell脚本调用Packer构建镜像时,尝试传递该变量,脚本如下:
$azureTags = @{ BusinessUnit = "IDS" Environment = "Production" } packer build -var "capture_name_prefix=$ResourcesNamePrefix" ` -var "client_id=$ClientId" ` -var "client_secret=$ClientSecret" ` -var "install_password=$InstallPassword" ` -var "location=$Location" ` -var "resource_group=$ResourceGroup" ` -var "storage_account=$StorageAccount" ` -var "subscription_id=$SubscriptionId" ` -var "temp_resource_group_name=$TempResourceGroupName" ` -var "tenant_id=$TenantId" ` -var "virtual_network_name=$VirtualNetworkName" ` -var "virtual_network_resource_group_name=$VirtualNetworkRG" ` -var "virtual_network_subnet_name=$VirtualNetworkSubnet" ` -var "run_validation_diskspace=$env:RUN_VALIDATION_FLAG" ` -var "azure_tags=$($azureTags | ConvertTo-Json -Compress)" ` -color=false ` $TemplatePath
执行后触发以下错误:
Build ubuntu2204 VM
Error: Variables not allowed
on value for var.azure_tags from arguments line 1:
作为Packer新手,请问问题出在哪里?
解决方法
问题原因:Packer命令行的
-var参数接受HCL表达式,而非JSON字符串。你传递的JSON格式会被Packer误解析为包含非法变量引用的内容,从而触发报错。正确传递方式:使用HCL原生的map语法传递变量,有两种实现方式:
- 直接写死HCL格式字符串:
-var "azure_tags={BusinessUnit=`"IDS`", Environment=`"Production`"}" ` - 动态拼接HCL格式(适合变量内容不固定的场景):
# 将PowerShell哈希表转为HCL map格式字符串 $azureTagsHcl = "{" + ($azureTags.GetEnumerator() | ForEach-Object { "`"$($_.Key)`"=`"$($_.Value)`"" }) -join ", " + "}" # 在packer build命令中引用该变量 packer build ... ` -var "azure_tags=$azureTagsHcl" ` ... ` $TemplatePath
- 直接写死HCL格式字符串:
原理说明:Packer在命令行解析
-var参数时,会按照HCL语法处理值内容。map类型需要用{key="value", key2="value2"}的HCL格式,JSON格式的结构和引号规则不符合HCL的变量解析逻辑,因此会被判定为非法变量引用。
内容的提问来源于stack exchange,提问作者Rob Bowman
相关产品推荐
相关产品推荐

