Packer是一款轻量级的镜像定义工具,能够运行在常用的主流操作系统(例如Windows、Linux和macOS)上,并行高效地创建多平台的虚拟机镜像。本文为您介绍如何在ECS实例中安装Packer、定义Packer模板并使用Packer创建自定义镜像。
前提条件
已创建AccessKey,并获取AccessKey ID和AccessKey Secret。具体操作,请参见创建AccessKey。
由于AccessKey权限过大,为防止数据泄露,建议您先创建RAM用户,再使用RAM用户创建AccessKey。创建RAM用户的具体操作,请参见创建RAM用户。
RAM用户的AccessKey Secret只在创建时显示,不支持查看,请妥善保管。
背景信息
Packer工具包含Builders(生成器)、Provisioners(配置器)、Post-Processors(后处理器)等组件,通过HCL(HashiCorp Configuration Language)或者JSON格式的模板文件较大地降低了创建自定义镜像的难度,并且将创建镜像的过程从人工的随机过程变成可以配置管理代码,从而减少了用户应用上云的障碍。
操作步骤
步骤一:安装Packer
远程连接ECS实例。
具体操作,请参见通过密码认证登录Linux实例。
运行以下命令,进入
/usr/local/bin
目录。cd /usr/local/bin
说明/usr/local/bin目录为环境变量目录,您可以将Packer安装到该目录下或其他已添加到环境变量的目录下。
运行以下命令,获取Packer安装包。
您也可以访问Packer下载页面获取与云服务器ECS操作系统及架构类型相对应的Packer安装包,本操作以packer_1.8.5_linux_amd64.zip为例。
wget https://releases.hashicorp.com/packer/1.8.5/packer_1.8.5_linux_amd64.zip
运行以下命令,解压Packer安装包。
unzip packer_1.8.5_linux_amd64.zip
运行以下命令查询Packer版本号,验证Packer的安装状态。
packer -v
如果返回Packer版本号,表示您已正确安装Packer。
如果返回信息提示
command not found
,表示Packer未正确安装,请检查Packer所在目录是否被添加到环境变量中。
步骤二:定义Packer模板
使用Packer创建自定义镜像时,需要创建一个HCL格式或者JSON格式的模板文件。在该模板文件中,您需要指定创建自定义镜像的生成器和配置器。更多信息,请参见Builders(生成器)和Provisioners(配置器)。Packer具有多种配置器类型可用于配置自定义镜像的内容生成方式,以下操作以常用的Shell配置器为例,定义Packer模板。
运行以下命令,导入您的AccessKey ID。
export ALICLOUD_ACCESS_KEY=<AccessKey ID>
请将
<AccessKey ID>
替换为您实际的AccessKey ID。查询RAM用户AccessKey ID的具体操作,请参见查看RAM用户的AccessKey信息。运行以下命令,导入您的AccessKey Secret。
export ALICLOUD_SECRET_KEY=<AccessKey Secret>
请将
<AccessKey Secret>
替换为您实际的AccessKey Secret。RAM用户的AccessKey Secret只在创建时显示,不支持查询。更多信息,请参见创建AccessKey。运行以下命令,创建名为
alicloud
的文件。说明您可以选择以下任意一种文件格式来创建
alicloud
文件,如果创建HCL格式的文件,后续就需要按照HCL模板来执行。HCL文件
vi alicloud.pkr.hcl
JSON文件
vi alicloud.json
按
i
键进入编辑模式,并根据实际情况修改以下自定义参数后粘贴内容到alicloud
文件中。HCL文件
variable "access_key" { type = string default = "${env("ALICLOUD_ACCESS_KEY")}" } variable "secret_key" { type = string default = "${env("ALICLOUD_SECRET_KEY")}" } source "alicloud-ecs" "autogenerated_1" { associate_public_ip_address = true image_name = "packer_basic" instance_type = "ecs.g6.large" internet_charge_type = "PayByTraffic" io_optimized = true region = "cn-qingdao" skip_image_validation = true source_image = "aliyun_3_x64_20G_alibase_20220907.vhd" ssh_username = "root" } build { sources = ["source.alicloud-ecs.autogenerated_1"] provisioner "shell" { inline = ["sleep 30", "yum install redis.x86_64 -y"] } }
JSON文件
{ "variables": { "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}", "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}" }, "builders": [{ "type":"alicloud-ecs", "region":"cn-qingdao", "image_name":"packer_basic", "source_image":"aliyun_3_x64_20G_alibase_20220907.vhd", "associate_public_ip_address":true, "ssh_username":"root", "instance_type":"ecs.g6.large", "internet_charge_type":"PayByTraffic", "io_optimized":true, "skip_image_validation":true }], "provisioners": [{ "type": "shell", "inline": [ "sleep 30", "yum install redis.x86_64 -y" ] }] }
您需要自定义的参数值如下表所示。
参数
描述
region
指定创建自定义镜像时使用临时资源的地域,例如
cn-qingdao
。image_name
指定创建的自定义镜像名称,例如
packer_basic
。source_image
基础镜像的名称,该镜像用于创建临时ECS实例。可以从ECS控制台公共镜像列表获得,也可以通过DescribeImages接口查询获得。
重要配置时需注意所选镜像类型需支持ECS实例的类型,例如ARM镜像(镜像ID携带_arm64_)需选用ARM类型的实例,否则无法成功创建自定义镜像。
instance_type
创建自定义镜像时生成的临时ECS实例的类型,例如
ecs.g6.large
规格。镜像创建完成后,该实例会被自动释放。说明使用Packer创建自定义镜像过程中,会调用CreateInstance接口创建ECS实例,该实例包含了用于创建自定义镜像的操作系统和预装软件等。该实例类型为按量付费,因此会产生部分费用。请确保您的阿里云账户余额(即现金余额)和代金券的总值不得小于100.00元人民币。
internet_charge_type
创建自定义镜像时临时实例的公网带宽付费类型。
PayByBandwidth:按固定带宽计费。
PayByTraffic:按使用流量计费。
provisioners
创建自定义镜像时使用的Packer配置器类型。主要包括:
File
PowerShell
Shell
Local Shell
Windows Shell
更多信息,请参见Provisioners(配置器)。
按
Esc
键,并输入:wq
后按下回车键,保存并退出。
步骤三:使用Packer创建自定义镜像
使用Packer模板文件生成自定义镜像的操作步骤如下:
运行以下命令,创建自定义镜像。
HCL文件
packer build alicloud.pkr.hcl
示例运行结果如下,以下示例表示将在华北1(青岛)地域创建镜像ID为
m-m5e3f0gu2dxs4z0s****
的自定义镜像。alicloud-ecs.autogenerated_1: output will be in this color. ==> alicloud-ecs.autogenerated_1: Prevalidating source region and copied regions... ==> alicloud-ecs.autogenerated_1: Prevalidating image name... alicloud-ecs.autogenerated_1: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs.autogenerated_1: Creating temporary keypair: packer_64bf3d40-2fe7-8251-276d-df59a0bb**** --------------------------- ==> alicloud-ecs.autogenerated_1: Provisioning with shell script: /tmp/packer-shell3356722207 alicloud-ecs.autogenerated_1: Last metadata expiration check: 0:00:11 ago on Tue 25 Jul 2023 11:12:18 AM CST. --------------------------- alicloud-ecs.autogenerated_1: Complete! ==> alicloud-ecs.autogenerated_1: Stopping instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Waiting instance stopped: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Creating image: packer_basic alicloud-ecs.autogenerated_1: Detach keypair packer_64bf3d40-2fe7-8251-276d-df59a0bb**** from instance: i-m5e87pt498pr8zv0**** ==> alicloud-ecs.autogenerated_1: Cleaning up 'EIP' ==> alicloud-ecs.autogenerated_1: Cleaning up 'instance' ==> alicloud-ecs.autogenerated_1: Cleaning up 'security group' ==> alicloud-ecs.autogenerated_1: Cleaning up 'vSwitch' ==> alicloud-ecs.autogenerated_1: Cleaning up 'VPC' ==> alicloud-ecs.autogenerated_1: Deleting temporary keypair... Build 'alicloud-ecs.autogenerated_1' finished after 4 minutes 32 seconds. ==> Wait completed after 4 minutes 32 seconds ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs.autogenerated_1: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s****
JSON文件
packer build alicloud.json
示例运行结果如下,以下示例表示将在华北1(青岛)地域创建镜像ID为
m-m5e3f0gu2dxs4z0s****
的自定义镜像。alicloud-ecs output will be in this color. ==> alicloud-ecs: Prevalidating image name... alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd ==> alicloud-ecs: Creating temporary keypair: packer_6345090e-ec1f-8ea0-348c-f85ba047**** ==> alicloud-ecs: Creating vpc --------------------------- ==> alicloud-ecs: Provisioning with shell script: /tmp/packer-shell090019677 alicloud-ecs: Last metadata expiration check: 0:00:15 ago on Tue 11 Oct 2022 02:12:51 PM CST. --------------------------- alicloud-ecs: Complete! ==> alicloud-ecs: Deleting image snapshots. ==> alicloud-ecs: Creating image: packer_basic alicloud-ecs: Detach keypair packer_6345090e-ec1f-8ea0-348c-f85ba047**** from instance: i-m5e7it5p4dpwetfr**** ==> alicloud-ecs: Cleaning up 'EIP' ==> alicloud-ecs: Cleaning up 'instance' ==> alicloud-ecs: Cleaning up 'security group' ==> alicloud-ecs: Cleaning up 'vSwitch' ==> alicloud-ecs: Cleaning up 'VPC' ==> alicloud-ecs: Deleting temporary keypair... Build 'alicloud-ecs' finished. ==> Builds finished. The artifacts of successful builds are: --> alicloud-ecs: Alicloud images were created: cn-qingdao: m-m5e3f0gu2dxs4z0s****
查看已创建的自定义镜像。
登录ECS管理控制台。
在左侧导航栏,选择 。
在顶部菜单栏左上角处,选择
alicloud
文件中指定的地域,例如华北1(青岛)。在自定义镜像页签下,镜像列表中查看生成的名称为packer_basic的自定义镜像。