本文提供了在阿里云ECS使用Packer创建自定义镜像的DevOps(开发运维一体化)常用配置,适用于使用Packer创建ECS自定义镜像的场景。
镜像标签
- 字段名称:tags{"key":"value"}。
- 适用场景:当您的自定义镜像达到一定的数量时,适当的标记镜像有利于镜像管理和检索。例如记录镜像版本号和镜像包含的应用类型等。阿里云Builder提供了tags参数,支持为镜像绑定标签。生成的镜像自动包含阿里云ECS标签,更多有关标签的详情,请参见标签概述。
- 配置作用:ECS管理控制台镜像列表页面和API DescribeImages均支持查询镜像时返回标签以及根据标签过滤镜像。为镜像绑定标签能够和Terraform一起为企业级标准化DevOps流程提供支持。
- 配置示例:以下配置文件为最终生成的镜像和对应的快照绑定
version=v1.0.0
和app=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" } }] }
只包含系统盘快照
- 字段名称:image_ignore_data_disks,数据类型为Boolean。
- 适用场景:默认情况下Packer直接从ECS实例创建镜像,从实例创建镜像时如果包含数据盘,则镜像会同时包含数据盘快照。创建包含数据盘的实例通常有两种方式:
- 方式一:通过image_disk_mappings设置数据盘相关参数。更多详情,请参见 《Packer文档》Alicloud Image Builder。
- 方式二:选择默认带有数据盘的实例规格。该类实例规格包含的数据盘大多为本地盘,如ecs.d1ne.2xlarge。本地盘当前并不支持创建快照,所以无法直接通过此类实例创建镜像。
- 配置作用:如果您需要选择默认带有数据盘的实例规格,但实际上数据盘部分并不是必须的,可以在配置文件中加上
"image_ignore_data_disks": "true"
实现只基于系统盘创建镜像。
设置快照超时时间
- 字段名称:wait_snapshot_ready_timeout,数据类型为Interger,默认值为3600(秒s)。
- 适用场景:创建镜像依赖于快照,快照的创建时间依赖于磁盘大小。当磁盘较大时,创建快照所需时间会相应增加。
- 配置作用:当磁盘太大导致超时错误时,可以通过
wait_snapshot_ready_timeout
调大超时时间。
通过私网IP连接实例
- 字段名称:ssh_private_ip,数据类型为Boolean。
- 适用场景:默认情况下,Packer创建EIP并绑定实例,再通过EIP对应的公网IP连接实例安装软件或执行命令。如果您能通过私网IP直接连接实例,可以免除公网IP。
- 配置作用:通过设置
"ssh_private_ip": "true"
,Packer不会分配EIP或者公网IP,而是通过私网IP连接实例。
设置停止实例选项
- 字段名称:disable_stop_instance,数据类型为Boolean。
- 适用场景:默认情况下,Packer执行完provisioners后,会先停止实例再创建镜像。某些特殊场景,如在Windows实例中运行Sysprep,需要实例处于运行中状态。
Sysprep的使用场景示例请参见修改Windows实例SID以搭建域环境。
- 配置作用:通过设置
"disable_stop_instance": "true"
,Packer不会主动停止实例,而是假设配置(provisioners)中提供的命令会自行停止实例。
通过UserData启用WinRM
- 字段名称:user_data_file。
- 适用场景:出于安全考虑,Windows镜像默认关闭了WinRM(Windows Remote Management)。但连接Windows实例及之后在实例内部执行命令都依赖于WinRM。在实例创建时,您可以通过UserData启用WinRM。
- 配置作用:通过配置
"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
表示如果存在同名镜像,则先删除已有镜像。
- 示例中与WinRM相关的参数含义如下:
基于本地ISO文件制作镜像
- 字段名称:builders{"type":"qemu"},post-processors{"type":"alicloud-import"}。
- 适用场景:如果线下ISO文件环境为其他虚拟化环境,也可以通过Packer完成操作。
- 配置示例:如果线下环境使用的是qemu,请参见使用Packer创建并导入本地镜像。文档中包含两个重要的部分:
- 您需要使用本地虚拟化环境或软件对应的Builder,如Qemu Builder。
- 请通过定义Alicloud Import Post-Processor将生成的本地镜像文件导入阿里云ECS。
如果您采用导入自定义镜像流程,请在本地安装虚拟化环境,将ISO文件制作成阿里云支持的镜像文件格式后再导入,如QCOW2、VHD和RAW。导入流程请参见导入镜像必读。
相关链接
更多参数和样例,请参见Packer官方文档Alicloud Image Builder和Examples。