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

本地制作kdk镜像 packer制作镜像_json

1.2申请工单

由于阿里云的镜像导入功能默认并不是开放的,所以在运行本示例前需要通过工单申请开通镜像上传功能,可以登录阿里云控制台,导航到镜像列表栏目,如果右部的”刷新“按钮旁边象下图一样没有”导入镜像“按钮,就需要“点击顶部的“工单”按钮,然后在工单管理页面通过如下步骤提交工单:

本地制作kdk镜像 packer制作镜像_本地制作kdk镜像_02

”提交工单“->"云服务器 ECS”->点击“提问”按钮->"镜像咨询“->"4. 如何把本地物理镜像导入到 ECS 中使用?"

在低部选择”提交工单”按钮。

本地制作kdk镜像 packer制作镜像_json_03



在"问题描述:“文本框中输入如下内容,然后填写其它必要信息,提交工单,等候工作人员批准。

在访问ECS镜像复制和镜像上传功能时没有权限。
CopyImage/CancelCopyImage/ImportImage/AliyunECSImageImportDefaultRole/AliyunECSImageImportRolePolicy

如果理由合理,一般一天左右,工单就会被批准,这些镜像列表栏目的右上部就会出现如下图的”导入镜像“按钮

本地制作kdk镜像 packer制作镜像_centos_04

1.3开通OSS

由于阿里云镜像上传功能需要通过OSS中转,所以如果还没有开通OSS,可以通过点击如下OSS控制台按照开通向导,一步一步的输入必要信息来开通OSS,由于过程并不复杂,本文就不赘述了。

2.安装packer和阿云插件

首先从Packer官网下载对应操作系统的安装包,点击如下图的官网链接下载packer安装包

本地制作kdk镜像 packer制作镜像_本地制作kdk镜像_05



然后打开终端,导航到下载目录下,执行如下命令,如果得到如下图的输出,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.jsonks.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按钮

本地制作kdk镜像 packer制作镜像_本地制作kdk镜像_06


然后在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会是一个漫长的过程,如果中间没有出错,当看到成功提示的结果,你就可以如下图在镜像列表中看到创建的自定义镜像。

本地制作kdk镜像 packer制作镜像_本地制作kdk镜像_07

4.展望

从上面的过程看,即使有了packer的帮助,制作一个本地的自定的镜像也不是一件容易的事情,但是随着开源社区的发展,对于常用的镜像模板,会非常容易的从社区获得,而且packer本身也比较年轻,随着功能的不断完善,镜像的制作一定会变得越来越容易。也希望大家能够为packer的完善贡献自己的力量。

packer的资源库
阿里云开源插件工具资源库