文档

Packer的DevOps常用配置

更新时间:

Packer是由HashiCorp出品的一个开源工具,用于创建相同配置的机器镜像,以供多个平台使用。在DevOps(开发运维一体化)实践中,Packer可以帮助自动化构建和部署过程,通过预先定义的模板来创建可移植和可重复使用的基础镜像,有助于保证在开发、测试和生产环境中的一致性。本文介绍在阿里云ECS使用Packer创建自定义镜像的DevOps常用配置(绑定镜像标签、配置只基于系统盘创建镜像、设置快照超时时间等),适用于使用Packer创建ECS自定义镜像的场景。

绑定镜像标签

  • 适用场景:当您的自定义镜像达到一定的数量时,适当地标记镜像有利于镜像管理和检索。例如,记录镜像版本号和镜像包含的应用类型等。阿里云Builder提供了tags参数,支持为镜像绑定标签。生成的镜像自动包含阿里云ECS标签,更多有关标签的详情,请参见标签概述

  • Packer字段名称:tags{"key":"value"}。

  • 配置作用:ECS管理控制台镜像列表页面和API接口DescribeImages均支持查询镜像时返回标签以及根据标签过滤镜像。为镜像绑定标签能够和Terraform一起为企业级标准化DevOps流程提供支持。

  • 配置示例:以下配置文件为最终生成的镜像和对应的快照绑定version=v1.0.0app=web两个标签。

    {
      "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-beijing",
        "image_name":"packer_basic",
        "source_image":"centos_7_03_64_20G_alibase_20170818.vhd",
        "ssh_username":"root",
        "instance_type":"ecs.t5-lc1m1.small",
        "internet_charge_type":"PayByTraffic",
        "io_optimized":"true",
        "tags": {
          "version": "v1.0.0",
          "app": "web"
        }
      }]
    }

配置只基于系统盘创建镜像

  • 适用场景:默认情况下,Packer直接从ECS实例创建镜像。如果实例包含了数据盘,则创建的镜像会同时包含数据盘快照。

    说明

    创建包含数据盘的实例通常有两种方式:

    • 方式一:通过image_disk_mappings设置数据盘相关参数。更多信息,请参见《Packer文档》Alicloud Image Builder

    • 方式二:选择默认带有数据盘的实例规格。该类实例规格包含的数据盘大多为本地盘,例如ecs.d1ne.2xlarge。但是本地盘并不支持创建快照,所以无法直接通过此类实例创建镜像。

  • Packer字段名称:image_ignore_data_disks,数据类型为Boolean。

  • 配置作用:如果您需要通过包含数据盘的实例创建镜像,但实际上创建镜像时不需要包含数据盘,可以在配置文件中加上"image_ignore_data_disks": "true"实现只基于系统盘创建镜像。

  • 配置示例:

    {
         "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-hangzhou",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd",
           "associate_public_ip_address":true,
           "ssh_username":"root",
           "instance_type":"ecs.s6-c1m2.large",
           "internet_charge_type":"PayByTraffic",
           "io_optimized":true,
           "skip_image_validation":true,
           "image_disk_mappings": [
            {
               "disk_snapshot_id": "s-bp1xxxxxx",
               "disk_device": "dev/xvdb"
            }],
           "image_ignore_data_disks": "true"
        }
      ]
    }

设置快照超时时间

  • 适用场景:创建镜像依赖于快照,快照的创建时间依赖于磁盘大小。如果您的磁盘较大,创建快照所需时间会相应增加导致超时错误时,您可以设置wait_snapshot_ready_timeout字段调大超时时间。

  • Packer字段名称:wait_snapshot_ready_timeout,数据类型为Integer,默认值为3600(秒)。

  • 配置作用:将wait_snapshot_ready_timeout设置为7200秒。

  • 配置示例:

    {
         "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-hangzhou",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd",
           "associate_public_ip_address":true,
           "ssh_username":"root",
           "instance_type":"ecs.s6-c1m2.large",
           "internet_charge_type":"PayByTraffic",
           "io_optimized":true,
           "skip_image_validation":true,
           "wait_snapshot_ready_timeout": 7200
        }
      ]
    }

通过私网IP连接实例

  • 适用场景:默认情况下,Packer创建EIP并绑定实例,再通过EIP对应的公网IP连接实例安装软件或执行命令。如果您能通过私网IP直接连接实例,可以省去公网IP。

  • Packer字段名称:ssh_private_ip,数据类型为Boolean。

  • 配置作用:通过设置"ssh_private_ip": true,Packer不会分配EIP或者公网IP,而是通过私网IP连接实例。

    重要

    运行Packer的机器需要和Packer创建的机器在同一个网络环境,即同一个交换机下,才能使用私网连接。

  • 配置示例:

    {
      "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-hangzhou",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd",
           "ssh_username":"root",
           "instance_type":"ecs.s6-c1m2.large",
           "internet_charge_type":"PayByTraffic",
           "io_optimized":true,
           "skip_image_validation":true,
           "ssh_private_ip": true,
           "vpc_id":"vpc-xxxx",
           "vswitch_id":"vsw-xxxx"
        }
      ]
    }

设置停止实例选项

  • 适用场景:默认情况下,Packer执行完provisioners后,会先停止实例再创建镜像。某些特殊场景,如在Windows实例中运行Sysprep,需要实例处于运行中状态。

    Sysprep的使用场景示例,请参见实例之间无法互相访问AD域或同时加入AD域怎么办?

  • Packer字段名称:disable_stop_instance,数据类型为Boolean。

  • 配置作用:通过设置"disable_stop_instance": true,Packer不会主动停止实例,需要在provisioners中提供停止实例的命令或手动停止实例。

  • 配置示例:

    {
         "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-hangzhou",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_9_x64_20G_alibase_20231219.vhd",
           "ssh_username":"root",
           "instance_type":"ecs.s6-c1m2.large",
           "internet_charge_type":"PayByTraffic",
           "io_optimized":true,
           "skip_image_validation":true,
           "associate_public_ip_address":true,
           "disable_stop_instance": true
        }
      ]
    }

通过UserData启用WinRM

  • 适用场景:出于安全考虑,Windows镜像默认关闭了WinRM(Windows Remote Management)。但连接Windows实例及之后在实例内部执行命令都依赖于WinRM。在实例创建时,您可以通过UserData启用WinRM。

  • Packer字段名称:user_data_file。

  • 配置作用:通过配置"user_data_file":"examples.ps1"指定UserData文件的路径。

  • 配置示例:本示例假定UserData文件在给定的相对路径examples/alicloud/basic/winrm_enable_userdata.ps1下。

    {
      "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-beijing",
        "image_name":"packer_test",
        "source_image":"win2008r2_64_ent_sp1_zh-cn_40G_alibase_20181220.vhd",
        "instance_type":"ecs.n1.tiny",
        "io_optimized":"true",
        "internet_charge_type":"PayByTraffic",
        "image_force_delete":"true",
        "communicator": "winrm",
        "winrm_port": 5985,
        "winrm_username": "Administrator",
        "winrm_password": "Test1234",
        "user_data_file": "examples/alicloud/basic/winrm_enable_userdata.ps1"
      }],
      "provisioners": [{
        "type": "powershell",
        "inline": ["dir c:\\"]
      }]
    }
    说明
    • 示例中与WinRM相关的参数含义如下:

      • "communicator": "winrm"表示通过WinRM连接实例。

      • "winrm_port": 5985表示通信端口为5985。

      • "winrm_username": "Administrator"表示连接时使用Administrator账户。

      • "winrm_password": "Test1234"表示密码采用Test1234。

    • image_force_delete表示如果存在同名镜像,则先删除已有镜像。

基于本地ISO文件制作镜像

  • 适用场景:如果线下ISO文件环境为其他虚拟化环境,也可以通过Packer完成操作。

  • Packer字段名称:builders{"type":"qemu"},post-processors{"type":"alicloud-import"}。

  • 配置示例:如果线下环境使用的是QEMU,请参见使用Packer创建并导入本地镜像。文档中包含两个重要的部分:

    1. 您需要使用本地虚拟化环境或软件对应的Builder,如Qemu Builder

    2. 请通过定义Alicloud Import Post-Processor将生成的本地镜像文件导入阿里云ECS。

如果您采用导入自定义镜像流程,请在本地安装虚拟化环境,将ISO文件制作成阿里云支持的镜像文件格式后再导入,如QCOW2、VHD和RAW。导入流程请参见导入镜像流程

相关文档

更多参数和样例,请参见Packer官方文档Alicloud Image BuilderExamples

  • 本页导读 (1)
文档反馈