Packer简介
Packer是一个从单一配置文件为多平台创建一致镜像的轻量级的开源工具。能够运行在主流的操作系统上,并行高效的创建多平台的虚拟机镜像,它为代码即基础结构提供了坚实的基础,通过packer较大的降低了了创建用户自定义镜像的难度,并且将创建镜像的过程从人工的随机过程变成可以配置管理代码,可测试的过程,从而减少了用户应用上云的障碍之一。下面就从实战的角度来构建一个chef server镜像来学习packer的使用。
Packer的安装
首先从Packer官网下载对应操作系统的安装包,本文以Mac OS X x64为例,点击如下图的官网链接下载packer安装包
然后打开终端,导航到下载目录下,执行如下命令,如果得到如下图的输出,packer就安装好了:
#unzip packer_0.12.3_darwin_amd64.zip
#sudo mv packer /usr/local/bin/
#packer
usage: packer [--version] [--help] <command> [<args>]
Available commands are:
build build image(s) from template
fix fixes templates from old versions of packer
inspect see components of a template
push push a template and supporting files to a Packer build service
validate check that a template is valid
version Prints the Packer version
由于阿里云的packer插件提交还在流程中,所以还需要从阿里云的开源站点下载阿里云的packer插件,然后执行如下命令,如果输出如下,插件就安装好了:
#tar -xvf packer-builder-alicloud-ecs_darwin-amd64.tgz
#sudo mv bin/packer-builder-alicloud-ecs /usr/local/bin/
# ls /usr/local/bin | grep packer
packer packer-builder-alicloud-ecs
创建chef server
从阿里云的packer插件代码站点下载样例文件alicloud.json,chef.sh,user_data.sh到同一目录,打开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_chef2",
"source_image":"ubuntu_14_0405_64_40G_base_20170222.vhd",
"ssh_username":"root",
"instance_type":"ecs.n1.medium",
"io_optimized":"true",
"image_force_delete":"true",
"ssh_password":"Test1234",
"user_data_file":"examples/alicloud/chef/user_data.sh"
}],
"provisioners": [{
"type": "file",
"source": "examples/alicloud/chef/chef.sh",
"destination": "/root/"
},{
"type": "shell",
"inline": [
"cd /root/",
"chmod 755 chef.sh",
"./chef.sh",
"chef-server-ctl reconfigure"
]
}]
}
将其中的"variable"部分的"access_key"和"secret_key"的值替换为你自已的access key和secret key,或者在终端中执行
#export ALICLOUD_ACCESS_KEY="<你的access_key>"
#export ALICLOUD_SECRET_KEY="<你的secret_key>"
你可以从阿里云控制台获取访问的AK,打开控制台登录后,点击页面右上角的登录名,出现如下图菜单,在菜单中选择accesskeys按钮
然后在Access key管理页面点击右上角的"创建Access Key"按钮,创建新的Access Key ID和Access Key Secret,将值替换模板中或者设置如上的环境变量。
然后修改如下两行的值
"user_data_file":"examples/alicloud/chef/user_data.sh"
"source": "examples/alicloud/chef/chef.sh",
为
"user_data_file":"user_data.sh"
"source": "chef.sh",
在文件所在的目录执行
#packer build alicloud.json
alicloud-ecs output will be in this color.
==> alicloud-ecs: Force delete flag found, skipping prevalidating alicloud image name
alicloud-ecs: Found image ID: ubuntu_14_0405_64_40G_base_20170222.vhd
==> alicloud-ecs: Not using temporary keypair
==> alicloud-ecs: Start create alicloud vpc
==> alicloud-ecs: Start creating vswitch...
==> alicloud-ecs: Start creating security groups...
==> alicloud-ecs: Start creating alicloud instance
.............
运行正常结束后,你就可以登录控制台镜像列表查看到刚才创建的镜像了。
然后基于这个自定义的镜像创建ECS实例,我的结果如下图,(注:如果创建的ECS实例是经典网络,需要登录到ECS实例上手动执行user_data.sh脚本)
然后在浏览器中输入如下地址:https://123.56.16.159/
你就可以看到chef的web界面了。(注:注意更改成你自已实例的IP地地址)
展望
诚然,引入新的机制,会引入相应的学习曲线,对于packer来说,编写可用的镜像模板文件不是一件简单的事情,但是随着开源的盛行,很多常用的的模板都能够从github上找到,例如如下资源库中就包含大量的模板,当然,由于阿里云的packer插件支持才刚刚起步,所以也欢迎大家以阿里云官方packer插件资源库来贡献一份力量。