Skip to Content
Operation GuideImageCreate and Import Local Images using Packer

Create and Import Local Images using Packer

Overview

Packer is a lightweight open-source tool for automatic image packaging launched by Hashicorp Company (for more details, refer to the previous document). UCloud Global now supports one-click importing of homemade local images into the UCloud Global cloud platform thanks to the integration of Packer.

Packer Official Download Page

For installing Packer

Open Source Repository Address

Welcome to contribute code to UCloud Global Packer Builder

Image Import Example

Next, a CentOS image will be created and imported using Packer. It is shown below:

Packer first makes a RAW image using QEMU Builder, stored in a local directory specified by user, and then uses import Post-Processors to store the local image to a UFile specified by user, and automate the import into the UCloud Global cloud platform.

Environment setup

Installing Packer

Configure default User

Set keys TEST_PUBLIC_KEY, TEST_PRIVATE_ KEY and project ID TEST_PROJECT_ID as global environment variables (recommended), or specify public_key、 private_key、 project_id explicitly in the json file.

Installing QEMU

  • Follow the official installation document, you can use command line to install, MacOS: brew install qemu, CentOs: yum install qemu-kvm, Ubuntu: apt-get install qemu

Creating a UFile bucket

Writing JSON File

We use the creation and import of a custom CentOS 6.10 image on MacOs as an example. Firstly, create a clean empty folder as a workspace, switch to that directory, and write a JSON spec file (eg:local.json), as follows :

{"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 64bits", "format": "raw" } ] }

This sets up a qemu Builder and an import Post-Processors, where the UFile bucket name and other information are configured.

Writing Kickstart Files

According to the http_directory and boot_command configured in the JSON file above for QEMU, you need to create a ./http/centos-6.10/ directory under the JSON file directory to store the Kickstart file, i.e., ks.cfg, as follows: (Kickstart reference document)

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

Running Command Line

By running the command packer build local.json, you can create and import a custom image in one click.