Packer 1.6.1不支持HCL2模板data块,如何替换以实现AMI查询功能?
问题解决方法
Packer 1.6.1版本的HCL2实现未支持data数据源块,推荐以下两种替换方案:
方案1:使用Amazon Builder原生的source_ami_filter配置(推荐)
AWS EBS等亚马逊相关的Packer Builder原生内置了AMI过滤能力,完全可以替代amazon-ami类型的data块,无需额外外部依赖:
修改后的source块代码示例:
source "amazon-ebs" "你的source名称" { ami_name = "${var.ami_name}" associate_public_ip_address = false force_deregister = true iam_instance_profile = "abc" instance_type = "****" region = "${var.aws_region}" # 删掉原来的source_ami = data.amazon-ami.autogenerated_1.id 这行 # 新增以下source_ami_filter配置,直接复用原来data块的参数 source_ami_filter { filters = { root-device-type = "ebs" virtualization-type = "hvm" name = "**** Linux *" } most_recent = true owners = ["${var.owner_id}"] } access_key = "${var.aws_access_key}" secret_key = "${var.aws_secret_key}" ssh_interface = "private_ip" ssh_username = "user" subnet_id = "subnet-********" vpc_id = "vpc-***********" }
该方案不需要修改任何流水线逻辑,仅调整模板内容即可直接在Packer 1.6.1上运行。
方案2:外部查询AMI ID作为变量传入
如果有跨多平台复用AMI查询逻辑的需求,可以先通过AWS CLI查询到符合条件的AMI ID,再作为变量传递给Packer运行:
步骤1:编写AWS CLI查询命令(Jenkins流水线中执行)
AMI_ID=$(aws ec2 describe-images \ --region ${AWS_REGION} \ --owners ${OWNER_ID} \ --filters "Name=root-device-type,Values=ebs" "Name=virtualization-type,Values=hvm" "Name=name,Values=**** Linux *" \ --query 'sort_by(Images, &CreationDate)[-1].ImageId' \ --output text)
步骤2:运行Packer时传入变量
packer build -var "aws_access_key=${AWS_ACCESS_KEY}" -var "aws_secret_key=${AWS_SECRET_KEY}" -var "source_ami_id=${AMI_ID}" 你的模板文件路径
步骤3:修改Packer模板
首先新增变量声明:
variable "source_ami_id" { type = string description = "外部传入的源AMI ID" }
然后修改source块中的对应配置:
source_ami = var.source_ami_id
完全删除原来的data "amazon-ami"块即可。
内容的提问来源于stack exchange,提问作者knowledge20
相关产品推荐
相关产品推荐

