使用 Packer 创建并导入本地镜像
概述
Packer 是 Hashicorp 公司推出的自动化打包镜像的轻量级开源工具(详细介绍可参考上篇文档)。TopnewCloud 通过对的 Packer 的集成,目前已支持一键导入自制的本地镜像到 TopnewCloud 云平台中。
相关链接
用于安装 Packer
欢迎为 TopnewCloud Packer Builder 贡献代码
镜像导入示例
下面将使用 Packer 制作并导入一个 CentOS 镜像。如下图所示:
Packer 首先利用 QEMU Builder 制作了一个 RAW 镜像,存放在本地配置的目录下,之后利用 import Post-Processors 后处理器 将本地的镜像存放到用户配置的 UFile 中,并自动化导入到 TopnewCloud 云平台中。
环境配置
安装 Packer
- 参照官方安装文档 安装 Packer
配置默认用户
设置密钥 TEST_PUBLIC_KEY, TEST_PRIVATE_ KEY 并设置项目ID TEST_PROJECT_ID 为全局环境变量(推荐),或在 json 文件中显式指定 public_key、 private_key、 project_id。
安装QEMU
- 参照官方安装文档 , 其中使用命令行安装,MacOS: brew install qemu, CentOs: yum install qemu-kvm, Ubuntu: apt-get install qemu
创建一个 UFile 的 bucket 空间
- 参照官方文档
编写 JSON 文件
让我们基于 MacOs 系统使用 QEMU 创建并导入一个 CentOS 6.10 的自定义镜像为例。首先创建一个干净的空文件夹作为工作区,并且切换到该目录下,编写一个 JSON 规格文件(eg:local.json),如下 :
{"variables": {
"test_public_key": "{{env `TEST_PUBLIC_KEY`}}",
"test_private_key": "{{env `TEST_PRIVATE_KEY`}}",
"test_project_id": "{{env `TEST_PROJECT_ID`}}",
"disk_size": "4096",
"iso_checksum": "0da4a1206e7642906e33c0f155d2f835",
"iso_checksum_type": "md5",
"iso_name": "CentOS-6.10-x86_64-minimal.iso",
"ks_path": "centos-6.10/ks.cfg",
"mirror": "http://mirrors.ustc.edu.cn/centos",
"mirror_directory": "6.10/isos/x86_64",
"template": "centos-6.10-x86_64"
},
"builders":[
{
"type": "qemu",
"boot_command": [
"<tab> text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{user `ks_path`}}<enter><wait>"
],
"boot_wait": "10s",
"disk_size": "{{user `disk_size`}}",
"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 'packer'|sudo -S shutdown -P now",
"ssh_password": "test_packer",
"ssh_port": 22,
"ssh_username": "root",
"ssh_timeout": "10000s",
"vm_name": "{{ user `template` }}.raw",
"net_device": "virtio-net",
"disk_interface": "virtio",
"format": "raw",
"use_default_display": "false",
"qemuargs": [
["-display", "cocoa"]
]
}
],
"post-processors":[
{
"type":"import",
"public_key": "{{user `test_public_key`}}",
"private_key": "{{user `test_private_key`}}",
"project_id": "{{user `test_project_id`}}",
"region":"cn-bj2",
"ufile_bucket_name": "packer-test",
"image_name": "packer_import_test",
"image_os_type": "CentOS",
"image_os_name": "CentOS 6.10 64位",
"format": "raw"
}
]
}
如上定义了一个 qemu Builder 构建器 和一个 import Post-Processors 后处理器 ,其中配置了UFile bucket name 等信息。
编写 Kickstart 文件
根据如上 JSON 文件 QEMU 中配置的 http_directory 和 boot_command,则需要 JSON 文件目录下创建一个 ./http/centos-6.10/ 目录用来存放 Kickstart 文件即 ks.cfg, 如下:(Kickstart参考文档 )
install
cdrom
lang en_US.UTF-8
keyboard us
network --bootproto=dhcp
rootpw test_packer
firewall --disabled
selinux --permissive
timezone UTC
unsupported_hardware
bootloader --location=mbr
text
skipx
zerombr
clearpart --all
autopart
auth --enableshadow --passalgo=sha512
firstboot --disabled
reboot
%packages --nobase --ignoremissing
sudo
gcc
make
%end
执行命令行
通过执行命令 packer build local.json 可以实现一键创建并导入自定义镜像。