如何在Packer中处理未评估数据源值以通过packer validate校验
Packer Validate 遇到标签值不符合正则的解决办法
已知packer validate可通过-evaluate-datasources参数评估数据源,但当前无法使用该选项。现有Packer配置如下:
variable "project_id" { type = string default = "my-gcp-project" } variable "source_image_family" { type = string default = "my-source-image-family" } data "googlecompute-image" "base_image" { filters = "family=${var.source_image_family}" project_id = var.project_id most_recent = true } locals { base_image_name = data.googlecompute-image.base_image.name } source "googlecompute" "import-export" { project_id = var.project_id # 其他配置项 source_image = local.base_image_name # 其他配置项 image_labels = { # 其他标签 "base_image" : local.base_image_name } labels = { # 其他标签 } # 其他配置项 } build { sources = ["sources.googlecompute.import-export"] # 其他配置项 }
运行packer validate时触发错误:value "<unknown>" for key "base_image" must match regex "^[\\p{Ll}0-9_-]{0,63}$"
尝试过replace、coalesce、lookup等内置字符串处理函数均无效,以下是可行的替代方案:
方案1:给占位符设置符合规则的默认值
通过条件判断在数据源未评估时,将<unknown>替换为符合GCP标签正则的默认值:
locals { base_image_name = data.googlecompute-image.base_image.name == "<unknown>" ? "temp-base-image" : data.googlecompute-image.base_image.name }
注意默认值必须满足^[\p{Ll}0-9_-]{0,63}$规则,比如由全小写字母、数字、下划线或短横线组合,长度不超过63字符。
方案2:用变量覆盖实现验证与构建分离
新增可选变量用于验证阶段占位,构建阶段自动使用真实数据源值:
variable "base_image_name_override" { type = string default = "default-base-image" # 符合标签规则的默认值 } locals { base_image_name = var.base_image_name_override != "" ? var.base_image_name_override : data.googlecompute-image.base_image.name }
验证阶段会使用默认值通过正则检查,实际构建时数据源会正常求值并覆盖默认值。
方案3:临时注释标签(紧急临时方案)
如果只是需要快速通过验证,可临时注释base_image标签,待实际构建前再恢复注释。
注:部分内置函数在validate阶段无法处理
<unknown>占位符,因为此时数据源未被评估,函数操作的对象是占位符而非真实字符串,因此条件判断或变量覆盖的方式更有效。
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

