什么是Packer
Packer是HashiCorp推出的一款工具,旨在提供简易的方式自动化构建镜像。通过Packer,你只需要在配置文件中指明镜像构建所需的基本信息及期望安装到镜像中的软件及配置,即可通过自动化脚本构建所需的镜像。由于构建镜像的过程被固化成了配置文件,每一个步骤都清晰可见易于回溯,无需担心多次构建得到的镜像存在不一致。且镜像构建配置化后,将为测试和更新镜像带来极大的便利,大大降低运维和管理镜像的成本。
在具体介绍Packer的使用方法之前,我们先来看下以前在阿里云ECS上如何手动创建一个自定义镜像。如果对这个流程已非常熟悉,可以直接跳到通过Packer构建镜像一节。
注意:后续操作会创建一些收费资源,请注意释放和清理,如实例、公网IP、快照等。
实例规格和镜像会随着时间的推移不断更新,本文后续提到的一些规格和镜像可能会在未来下线,所以具体操作流程可以根据实际情况选择不同的规格、镜像或者其他实例相关的资源。
手动创建自定义镜像
简单起见,假设我们需要在阿里云北京地域构建一个CentOS 7.3的镜像,其中需要安装redis,其他方面无特定需求,则整个创建步骤如下所示:
- 打开ECS售卖页,从上到下依次选择
按量付费
=>华北2(北京)
=>ecs.t5-lc1m1.small
=>公共镜像CentOS 7.3 64位
,点击页面右下方下一步:网络和安全组
。 - 继续选择
专有网络
=>公网带宽
=>安全组
,点击页面右下方下一步:系统配置
。 - 继续选择
秘钥对
,如不存在需要新建秘钥对
,便于后续通过秘钥连接实例。其余配置保持默认,点击页面右下方确认订单
后创建实例
。 - 购买流程完成后,可在ECS控制台华北2(北京)地域看到新建的实例,稍等片刻待实例状态变成运行中。
- 连接并登陆新创建的实例,通过命令行安装redis。连接方式可参照使用SSH密钥对连接Linux实例一文。
- 安装完成后回到控制台
实例列表
,点击对应实例右侧更多
=>磁盘和镜像
=>创建自定义镜像
,等待自定义镜像创建完成。 - 最后清理不需要的资源,释放实例、公网IP(如果是弹性公网IP)。如果需要,可以进一步删除VPC、安全组等仅用于测试的资源。
上述过程实际上简化了镜像内最为关键的软件及其配置部分,实际上该过程会随着镜像内需预装的软件及其配置不断扩充变得愈发复杂。通过人肉保证每一次操作都准确无误,和之前毫无偏差,会是一件非常困难的事情,更别提之后的维护和更新了。接下来我们将看到如何通过Packer自动化地完成上述镜像构建构成。
通过Packer构建镜像
如上所述,Packer通过配置文件记录镜像构建过程中所需的所有细节。如下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-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"
}],
"provis