Packer创建阿里云本地镜像
通过手工创建在本地镜像,并且上传到云环境是一个复杂而易错的过程,而packer的出现极大的降低了这种复杂度,本文详细了讲解了如何在ubuntu(16.04或者更高版本)系统基于packer创建centos 6.8的镜像并上传到阿里云自定义镜像的全过程。
1.准备
1.1安装kvm
- 首先查看cpu是否支持kvm,执行如下命令,如果有类似下面的输出,就是支持kvm:
# egrep "(svm|vmx)" /proc/cpuinfo
pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
- 打开终端然后执行如下命令安装kvm :
sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils
- 安装结束后,可以执行如下命令,会出现virt-manager的界面,如果通过通过GUI创建虚拟机,那么kvm就安装完了
sudo virt-manager
1.2申请工单
由于阿里云的镜像导入功能默认并不是开放的,所以在运行本示例前需要通过工单申请开通镜像上传功能,可以登录阿里云控制台,导航到镜像列表栏目,如果右部的”刷新“按钮旁边象下图一样没有”导入镜像“按钮,就需要“点击顶部的“工单”按钮,然后在工单管理页面通过如下步骤提交工单:
”提交工单“->"云服务器 ECS”->点击“提问”按钮->"镜像咨询“->"4. 如何把本地物理镜像导入到 ECS 中使用?"
在低部选择”提交工单”按钮。
在"问题描述:“文本框中输入如下内容,然后填写其它必要信息,提交工单,等候工作人员批准。
在访问ECS镜像复制和镜像上传功能时没有权限。
CopyImage/CancelCopyImage/ImportImage/AliyunECSImageImportDefaultRole/AliyunECSImageImportRolePolicy
如果理由合理,一般一天左右,工单就会被批准,这些镜像列表栏目的右上部就会出现如下图的”导入镜像“按钮
1.3开通OSS
由于阿里云镜像上传功能需要通过OSS中转,所以如果还没有开通OSS,可以通过点击如下OSS控制台按照开通向导,一步一步的输入必要信息来开通OSS,由于过程并不复杂,本文就不赘述了。
2.安装packer和阿云插件
首先从Packer官网下载对应操作系统的安装包,点击如下图的官网链接下载packer安装包
然后打开终端,导航到下载目录下,执行如下命令,如果得到如下图的输出,packer就安装好了:
#unzip packer_0.12.3_linux_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_linux-amd64.tgz
#sudo mv bin/* /usr/local/bin/
# ls /usr/local/bin | grep packer
packer packer-builder-alicloud-ecs packer-post-processor-alicloud-import
3.本地镜像的制作
从阿里云的官方插件站点下载 centos.json 和[ks.cfg],cetnos.json的内容如下,
{"variables": {
"box_basename": "centos-6.8",
"build_timestamp": "{
{isotime \"20060102150405\"}}",
"cpus": "1",
"disk_size": "4096",
"git_revision": "__unknown_git_revision__",
"headless": "",
"http_proxy": "{
{env `http_proxy`}}",
"https_proxy": "{
{env `https_proxy`}}",
"iso_checksum": "0ca12fe5f28c2ceed4f4084b41ff8a0b",
"iso_checksum_type": "md5",
"iso_name": "CentOS-6.8-x86_64-minimal.iso",
"ks_path": "centos-6.8/ks.cfg",
"memory": "512",
"metadata": "floppy/dummy_metadata.json",
"mirror": "http://mirrors.aliyun.com/centos",
"mirror_directory": "6.8/isos/x86_64",
"name": "centos-6.8",
"no_proxy": "{
{env `no_proxy`}}",
"template": "centos-6.8-x86_64",
"version": "2.1.TIMESTAMP"
},
"builders":[
{
"boot_command": [
"<tab> text ks=http://{
{ .HTTPIP }}:{
{ .HTTPPort }}/{
{user `ks_path`}}<enter><wait>"
],
"boot_wait": "10s",
"disk_size": "{
{user `disk_size`}}",
"headless": "{
{ user `headless` }}",
"http_directory": "http",
"iso_checksum": "{
{user `iso_checksum`}}",
"iso_checksum_type": "{
{user `iso_checksum_type`}}",
"iso_url": "{
{user `mirror`}}/{
{user `mirror_directory`}}/{
{user `iso_name`}}",
"output_directory": "packer-{
{user `template`}}-qemu",
"shutdown_command": "echo 'vagrant'|sudo -S /sbin/halt -h -p",
"ssh_password": "vagrant",
"ssh_port": 22,
"ssh_username": "root",
"ssh_wait_timeout": "10000s",
"type": "qemu",
"vm_name": "{
{ user `template` }}.raw",
"net_device": "virtio-net",
"disk_interface": "virtio",
"format": "raw"
}
],
"post-processors":[
{
"type":"alicloud-import",
"oss_bucket_name": "packer",
"image_name": "packer_import",
"image_os_type": "linux",
"image_platform": "CentOS",
"image_architecture": "x86_64",
"image_system_size": "40",
"region":"cn-beijing"
}
]
}
在终端中执行如下命令设置阿里云访问的AK
#export ALICLOUD_ACCESS_KEY="<你的access_key>"
#export ALICLOUD_SECRET_KEY="<你的secret_key>"
你可以从阿里云控制台获取访问的AK,打开控制台登录后,点击页面右上角的登录名,出现如下图菜单,在菜单中选择accesskeys按钮
然后在Access key管理页面点击右上角的"创建Access Key"按钮,创建新的Access Key ID和Access Key Secret,将值替换模板中或者设置如上的环境变量。
在终端中,导航到centos.json文件所在的目录,执行
#mkdir -p http/centos-6.8
#mv ks.cfg http/centos-6.8/
#packer build alicloud.json
qemu output will be in this color.
==> qemu: Downloading or copying ISO
qemu: Downloading or copying: http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
==> qemu: Creating hard drive...
==> qemu: Starting HTTP server on port 8665
................................................
==> qemu: Running post-processor: alicloud-import
qemu (alicloud-import): Deleting import source https://oss-cn-beijing.aliyuncs.com/packer/centos_x86_64
Build 'qemu' finished.
==> Builds finished. The artifacts of successful builds are:
--> qemu: Alicloud images were created:
cn-beijing: m-2zecept2coytitjjixyc
由于镜像有4G的大小,上传到OSS会是一个漫长的过程,如果中间没有出错,当看到成功提示的结果,你就可以如下图在镜像列表中看到创建的自定义镜像。
4.展望
从上面的过程看,即使有了packer的帮助,制作一个本地的自定的镜像也不是一件容易的事情,但是随着开源社区的发展,对于常用的镜像模板,会非常容易的从社区获得,而且packer本身也比较年轻,随着功能的不断完善,镜像的制作一定会变得越来越容易。也希望大家能够为packer的完善贡献自己的力量。
packer的资源库
阿里云开源插件工具资源库