Packer v1.9.4 HCL2模板调用formatdate函数验证报错求助
问题
我尝试在Packer v1.9.4的HCL2模板中定义变量:
variable "timestamp" { type = string default = formatdate("YYMMDDhhmmss", timestamp()) }
执行模板验证时出现如下错误:
Error: Call to unknown function on C:\Users\mathe\Documents\Azure Files\Packer Templates\avd-packer-win10-proto.pkr.hcl line 19, in variable "timestamp": 19: default = formatdate("YYMMDDhhmmss", timestamp()) There is no function named "formatdate".
我感到困惑的是,Packer官方文档明确提及了formatdate函数。请问该函数是否已被移除或替换?是否缺少相关插件?另外,不使用default的话,有没有更好的方式来赋值这类变量?
解答
关于formatdate函数的疑问
formatdate函数并没有被移除,但它不属于Packer核心函数,而是Packer模板专用的函数,且有使用场景限制:变量的default字段属于模板加载的早期阶段,此时这类专用函数还未被初始化,所以无法在这里调用。- 不需要额外安装插件,问题出在函数的使用范围,而非插件缺失。
替代实现方案
如果不使用default字段,有几种更合适的方式生成格式化时间戳:
在
locals块中定义
把时间戳放在locals块里,这里可以正常使用formatdate函数:locals { timestamp = formatdate("YYMMDDhhmmss", timestamp()) }后续在模板里直接用
local.timestamp引用这个值就行。通过命令行参数传递
执行Packer命令时,直接用-var参数传入预先格式化好的时间戳:# Linux/macOS packer build -var "timestamp=$(date +%y%m%d%H%M%S)" your-template.pkr.hcl# Windows PowerShell packer build -var "timestamp=$(Get-Date -Format 'yyMMddHHmmss')" your-template.pkr.hcl直接在构建环节使用
如果时间戳只用来命名镜像、输出文件这类构建相关的内容,可以直接在source或build块里调用formatdate:source "azure-arm" "win10_proto" { # 其他配置项... image_name = "win10-proto-${formatdate("YYMMDDhhmmss", timestamp())}" }
内容的提问来源于stack exchange,提问作者theillien
相关产品推荐
相关产品推荐

