阿里云中的每个ECS实例都由包含不同操作系统分发和版本的镜像创建。 镜像可包括预安装的应用程序和配置。 阿里云市场为最常见的操作系统和应用程序环境提供许多第一和第三方镜像,或者也可创建满足自身需求的自定义镜像。 本文详细介绍了如何使用开源工具 Packer 在阿里云中定义和生成自定义镜像。
1. 安装Packer
安装
从Packer官方站点的下载页面选择与你操作系统对应的版本,下载后解压缩到任何目录,安装就完成了,为了方便你在命令行使用,你可以将packer命令移动到位于环境变量PATH中定义的目录下或者将packer命令所在的目录添加到系统PATH变量中。
验证
为了验证你的Packer安装正确,在你的系统中运行"packer -v"(注:windows请运行"packer.exe -v") 你应该可以看到如下示例的帮助信息。如果输出的错误信息是找不到Packer命令,请确保packer程序位于你的PATH环境变量指定的路径下。
$ packer -v
0.12.1
2. 获取阿里云Access Key
- 登陆 阿里云官方网站
- 进入页面上方菜单【管理控制台】
- 进入页面上方级菜单【Access Key】
- 页面所显示的Access Key ID和Access Key Secret则为所需ID和Key
3. 定义 Packer 模板
生成镜像,需创建一个JSON格式的模板文件。 在模板中,定义执行实际生成过程的生成器和配置器。 Packer 具有多种配置器,可用于自定义镜像的内容生成方式,在下面的示例中使用最常用的Shell类型。
创建名为 alicloud.json 的文件并粘贴以下内容。 为以下内容输入自己的值:
参数 | 获取位置 |
---|---|
access_key | 从上一步中获取的 Access Key ID |
secret_key | 从上一步中获取的 Access Key Secret |
region | 创建镜像使用临时资源的区域 |
image_name | 创建的镜像名称 |
source_image | 基础镜像的名称,可以从阿里云公有镜像列表获得 |
instance_type | 创建镜像时生成的临时实例的类似 |
internet_charge_type | 创建镜像时临时实例的网络付费类型 |
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-beijing",
"image_name":"packer_basic",
"source_image":"centos_7_02_64_20G_alibase_20170818.vhd",
"ssh_username":"root",
"instance_type":"ecs.n1.tiny",
"internet_charge_type":"PayByTraffic",
"io_optimized":"true"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"yum install redis.x86_64 -y"
]
}]
}
4. 生成 Packer 映像
如果尚未在本地计算机上安装 Packer,请按照第一步安装或者 Packer 安装说明进行安装。
通过指定 Packer 模板文件生成镜像,如下所示:
$ export ALICLOUD_ACCESS_KEY=在第2步获得的Access Key ID
$ export ALICLOUD_SECRET_KEY=在第2步得的Access Key Secret
$ packer build alicloud.json
alicloud-ecs output will be in this color.
==> alicloud-ecs: Prevalidating alicloud image name...
alicloud-ecs: Found image ID: centos_7_02_64_20G_alibase_20170818.vhd
==> alicloud-ecs: Start creating temporary keypair: packer_59e44f40-c8d6-0ee3-7fd8-b1ba08ea94b8
==> alicloud-ecs: Start creating alicloud vpc
==> alicloud-ecs: Start creating vswitch...
==> alicloud-ecs: Start creating security groups...
==> alicloud-ecs: Start creating alicloud instance
==> alicloud-ecs: Start allocated alicloud eip
==> alicloud-ecs: Allocated alicloud eip 39.106.47.173
==> alicloud-ecs: Alcoud instance starting
alicloud-ecs: Attach keypair packer_59e44f40-c8d6-0ee3-7fd8-b1ba08ea94b8 to instance: i-2zefhslbbsg76l3g5bf9
==> alicloud-ecs: Waiting for SSH to become available...
==> alicloud-ecs: Connected to SSH!
==> alicloud-ecs: Provisioning with shell script: /var/folders/3q/w38xx_js6cl6k5mwkrqsnw7w0000gn/T/packer-shell257466182
alicloud-ecs: Loaded plugins: fastestmirror
alicloud-ecs: Determining fastest mirrors
alicloud-ecs: Resolving Dependencies
alicloud-ecs: --> Running transaction check
alicloud-ecs: ---> Package redis.x86_64 0:3.2.10-2.el7 will be installed
alicloud-ecs: --> Processing Dependency: libjemalloc.so.1()(64bit) for package: redis-3.2.10-2.el7.x86_64
alicloud-ecs: --> Running transaction check
alicloud-ecs: ---> Package jemalloc.x86_64 0:3.6.0-1.el7 will be installed
alicloud-ecs: --> Finished Dependency Resolution
alicloud-ecs:
alicloud-ecs: Dependencies Resolved
alicloud-ecs:
alicloud-ecs: ================================================================================
alicloud-ecs: Package Arch Version Repository Size
alicloud-ecs: ================================================================================
alicloud-ecs: Installing:
alicloud-ecs: redis x86_64 3.2.10-2.el7 epel 545 k
alicloud-ecs: Installing for dependencies:
alicloud-ecs: jemalloc x86_64 3.6.0-1.el7 epel 105 k
alicloud-ecs:
alicloud-ecs: Transaction Summary
alicloud-ecs: ================================================================================
alicloud-ecs: Install 1 Package (+1 Dependent package)
alicloud-ecs:
alicloud-ecs: Total download size: 650 k
alicloud-ecs: Installed size: 1.7 M
alicloud-ecs: Downloading packages:
alicloud-ecs: --------------------------------------------------------------------------------
alicloud-ecs: Total 1.3 MB/s | 650 kB 00:00
alicloud-ecs: Running transaction check
alicloud-ecs: Running transaction test
alicloud-ecs: Transaction test succeeded
alicloud-ecs: Running transaction
alicloud-ecs: Installing : jemalloc-3.6.0-1.el7.x86_64 1/2
alicloud-ecs: Installing : redis-3.2.10-2.el7.x86_64 2/2
alicloud-ecs: Verifying : redis-3.2.10-2.el7.x86_64 1/2
alicloud-ecs: Verifying : jemalloc-3.6.0-1.el7.x86_64 2/2
alicloud-ecs:
alicloud-ecs: Installed:
alicloud-ecs: redis.x86_64 0:3.2.10-2.el7
alicloud-ecs:
alicloud-ecs: Dependency Installed:
alicloud-ecs: jemalloc.x86_64 0:3.6.0-1.el7
alicloud-ecs:
alicloud-ecs: Complete!
==> alicloud-ecs: Start delete alicloud image snapshots
==> alicloud-ecs: Creating alicloud images: packer_basic
alicloud-ecs: Detach keypair packer_59e44f40-c8d6-0ee3-7fd8-b1ba08ea94b8 from instance: i-2zefhslbbsg76l3g5bf9
==> alicloud-ecs: Clean the created EIP
==> alicloud-ecs: Clean the created instance
==> alicloud-ecs: Clean the created security group
==> alicloud-ecs: Clean the created vSwitch
==> alicloud-ecs: Clean the created 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-beijing: m-2ze12578be1oa4ovs6r9
执行完成后,就可以在自定义镜像列表中刚才创建的包含了安装好redis的自定义镜像了。基于这个镜像就可以创建包含redis应用的ECS实例。更多的参考可以访问阿里云官方插件仓库和 Packer 官方文档