Use Packer to create and import local images
Overview
Packer is a lightweight open-source tool for automated image packaging launched by Hashicorp (for a detailed introduction, please refer to the previous document)。UCloud-Global now supports one-click import of custom local images to the UCloud-Global cloud platform through the integration of Packer.
Related Links
Official reference document address for image import (opens in a new tab)
Used to query various parameters of ucloud import Post-Processors
Packer Official Download Page (opens in a new tab)
Used for installing Packer
Open Source Repository Address (opens in a new tab)
Welcome to contribute code to ucloud Packer Builder
Image Import Example
Next, we will use Packer to create and import a CentOS image, as shown below:
Packer first utilizes QEMU Builder (opens in a new tab) to create a RAW image, which is stored in the locally configured directory. Then, it uses ucloud-import Post-Processors (opens in a new tab) to store the local image in the UFile configured by the user, and automatically imports it into the ucloud cloud platform.
Environment Configuration
Installation Packer
- Refer to the Official Installation Document (opens in a new tab)installation Packer
Configure Default User
Set the keys UCLOUD_PUBLIC_KEY, UCLOUD_PRIVATE_KEY and set the project ID UCLOUD_PROJECT_ID as global environment variables (recommended), or explicitly specify public_key, private_key, project_id in the json file.
Installation QEMU
- Refer to the Official Installation Document (opens in a new tab), where Command Line Installation is used,MacOS: brew install qemu, CentOs: yum install qemu-kvm, Ubuntu: apt-get install qemu
Create a UFile bucket space
- Refer to the Official Installation Document
Write JSON file
Let's take the example of creating and importing a custom CentOS 6.10 image using QEMU based on the MacOS system, Example Link (opens in a new tab). First, create a clean empty folder as a workspace and switch to that directory, write a JSON specification file (eg: local.json), as follows :
{"variables": {
"ucloud_public_key": "{{env `UCLOUD_PUBLIC_KEY`}}",
"ucloud_private_key": "{{env `UCLOUD_PRIVATE_KEY`}}",
"ucloud_project_id": "{{env `UCLOUD_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": "ucloud_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":"ucloud-import",
"public_key": "{{user `ucloud_public_key`}}",
"private_key": "{{user `ucloud_private_key`}}",
"project_id": "{{user `ucloud_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"
}
]
}
As defined above, a qemu Builder and a ucloud-import Post-Processors (opens in a new tab) are set up, where information such as the UFile bucket name is configured.
Write Kickstart file
According to the http_directory and boot_command configured in QEMU in the above JSON file, a ./http/centos-6.10/ directory needs to be created under the JSON file directory to store the Kickstart file, i.e., ks.cfg, as follows: (Kickstart Reference Document (opens in a new tab))
install
cdrom
lang en_US.UTF-8
keyboard us
network --bootproto=dhcp
rootpw ucloud_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
Execute Command Line
By executing the command packer build local.json, you can create and import custom images with one click.