Packer是一款轻量级的镜像定义工具,能够运行在常用的主流操作系统(例如Windows、Linux和macOS)上,并行高效的创建多平台的虚拟机镜像。本文为您介绍如何安装并使用Packer创建自定义镜像。

前提条件

已创建AccessKey,并获取AccessKey ID和AccessKey Secret。具体操作,请参见创建AccessKey
说明
  • 由于AccessKey权限过大,为防止数据泄露,建议您先创建RAM用户,再使用RAM用户创建AccessKey。创建RAM用户的具体操作,请参见创建RAM用户
  • RAM用户的AccessKey Secret只在创建时显示,不支持查看,请妥善保管。

背景信息

Packer工具包含Builders(生成器)Provisioners(配置器)Post-Processors(后处理器)等组件,通过JSON格式的模板文件较大地降低了创建自定义镜像的难度,并且将创建镜像的过程从人工的随机过程变成可以配置管理代码,从而减少了用户应用上云的障碍之一。本文以Linux系统的服务器为例进行介绍,Windows系统的具体操作请参见Packer官方文档

操作流程

Linux服务器使用Packer创建自定义镜像的操作流程如下:
  1. 步骤一:安装Packer
  2. 步骤二:定义Packer模板
  3. 步骤三:使用Packer创建自定义镜像

步骤一:安装Packer

  1. 远程连接ECS实例。
    具体操作,请参见通过密码认证登录Linux实例
  2. 运行以下命令,进入/usr/local/bin目录。
    cd /usr/local/bin
    说明 /usr/local/bin目录为环境变量目录,您可以将Packer安装到该目录下或其他已添加到环境变量的目录下。
  3. 运行以下命令,获取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
  4. 运行以下命令,解压Packer安装包。
    unzip packer_1.8.5_linux_amd64.zip
  5. 运行以下命令查询Packer版本号,验证Packer的安装状态。
    packer -v
    • 如果返回Packer版本号,表示您已正确安装Packer。
    • 如果返回信息提示command not found,表示Packer未正确安装,请检查Packer所在目录是否被添加到环境变量中。

步骤二:定义Packer模板

使用Packer创建自定义镜像时,需要创建一个JSON格式的模板文件。在该模板文件中,您需要指定创建自定义镜像的生成器和配置器。更多信息,请参见Builders(生成器)Provisioners(配置器)。Packer具有多种配置器类型可用于配置自定义镜像的内容生成方式,以下操作以常用的Shell配置器为例,定义Packer模板。

  1. 运行以下命令,创建名为alicloud的JSON文件。
    vi alicloud.json
  2. i键进入编辑模式,并根据实际情况修改以下自定义参数后粘贴内容到alicloud.json文件。
    {
         "variables": {
           "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
           "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
         },
         "builders": [{
           "type":"alicloud-ecs",
           "access_key":"{{user `access_key`}}",
           "secret_key":"{{user `secret_key`}}",
           "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"
           ]
         }]
       }
    您需要自定义的参数值如下表所示。
    参数描述
    access_key您的AccessKey ID。查询RAM用户AccessKey ID的具体操作,请参见查看RAM用户的AccessKey信息
    secret_key您的AccessKey Secret。RAM用户的AccessKey Secret只在创建时显示,不支持查询。更多信息,请参见创建AccessKey
    region指定创建自定义镜像时使用临时资源的地域,例如cn-qingdao
    image_name指定创建的自定义镜像名称,例如packer_basic
    source_image基础镜像的名称,该镜像用于创建临时ECS实例。可以从ECS控制台公共镜像列表获得,也可以通过DescribeImages接口查询获得。
    instance_type创建自定义镜像时生成的临时ECS实例的类型,例如ecs.g6.large规格。镜像创建完成后,该实例会被自动释放。
    说明 使用Packer创建自定义镜像过程中,会调用创建一台包年包月或者按量付费ECS实例接口创建ECS实例,该实例包含了用于创建自定义镜像的操作系统和预装软件等。该实例类型为按量付费,因此会产生部分费用。请确保您的阿里云账户余额(即现金余额)和代金券的总值不得小于100.00元人民币。
    internet_charge_type创建自定义镜像时临时实例的公网带宽付费类型。
    • PayByBandwidth:按固定带宽计费。
    • PayByTraffic:按使用流量计费。
    provisioners创建自定义镜像时使用的Packer配置器类型。更多信息,请参见Provisioners(配置器)
  3. Esc键,并输入:wq后按下回车键,保存并退出。

步骤三:使用Packer创建自定义镜像

使用Packer模板文件生成自定义镜像的操作步骤如下:

  1. 创建自定义镜像。
    1. 运行以下命令,导入您的AccessKey ID。
      export ALICLOUD_ACCESS_KEY=<AccessKey ID>
      请将<AccessKey ID>替换为您实际的AccessKey ID。
    2. 运行以下命令,导入您的AccessKey Secret。
      export ALICLOUD_SECRET_KEY=<AccessKey Secret>
      请将<AccessKey Secret>替换为您实际的AccessKey Secret。
    3. 运行以下命令,创建自定义镜像。
      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****
  2. 查看已创建的自定义镜像。
    1. 登录ECS管理控制台
    2. 在左侧导航栏,选择实例与镜像 > 镜像
    3. 在顶部菜单栏左上角处,选择alicloud.json文件中指定的地域,例如华北1(青岛)。
    4. 自定义镜像页签下,镜像列表中查看生成的名称为packer_basic的自定义镜像。
      生成的自定义镜像

后续步骤

自定义镜像创建完成后,您可以使用该镜像创建ECS实例。具体操作,请参见使用自定义镜像创建实例