Use Packer to create custom images
Note: Temporary resources will be created during the process of using Packer to create custom images. These temporary resources will be automatically deleted after the build is completed, thus incurring certain charges.
Overview
Packer is a lightweight open-source tool for automated image packaging launched by Hashicorp. Cloud vendors can integrate their own Builder into Packer, and with a single configuration file, they can efficiently and concurrently create consistent images for multi-cloud platforms. Packer can run on commonly used mainstream operating systems. It is not a substitute for software like Chef, Puppet, but integrates and uses these automation configuration tools to pre-install software on images. Combined with tools like UCloud-Global Terraform and Ucloud CLI, it can implement Infrastructure as Code (IaC), continuous integration, and rapid delivery in multi-cloud DevOps scenarios.
As shown in the figure below, Packer integrates tools such as Chef, Shell, Puppet, etc. in the Provisioner to create immutable images containing various software, which are used by cloud hosts of multi-cloud platforms, Docker, etc.
Comparison of Packer and Traditional Console Image Creation
Console Image Creation | Packer Image Creation | |
---|---|---|
Usage | Click on the console | Build using configuration file |
Reusability | Low. The same operation needs to be performed each time, and image consistency cannot be guaranteed, no version management | High. Copy and modify the configuration file, version management possible |
Complexity of Operation | High. First, create a cloud host using the base image, and manually log in to the cloud host for deployment, then manually create the image | Low. Execute the configuration file, automatically execute the pre-configured automation script, and then automatically build the image |
Creation Time | Long. Procedural operation, requires manual guarding, cannot accurately wait for each process to execute | Short. Automated workflow operation, perfect polling waiting mechanism, seamless connection of each process |
Lifecycle of Creating Images with Packer
- Users build a JSON template and execute the packer build command to call the UCloud-Global Builder;
- Parameter validation is performed in advance to ensure availability;
- Create temporary resources related to cloud hosts, EIP, etc. (EIP is not required if configured in an intranet environment);
- Connect to the host through SSH or WinRM, etc., and execute the Provisioner process;
- Shut down the cloud host and create an image;
- Copy the image;
- Delete temporary resources such as hosts, EIP, etc.;
- Execute the post-processing process (such as local image import, etc.).
Quick Start
Related Links
Official Reference Document Address (opens in a new tab)
Used to query various parameters of UCloud-Global Packer Builder
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
Environment Configuration
Install Packer
- Install Packer according to the official installation document (opens in a new tab)Install Packer
Configure Default User
Set the keys UCloud-Global_PUBLIC_KEY, UCloud-Global_PRIVATE_KEY and set the project ID UCloud-Global_PROJECT_ID as global environment variables (recommended), or explicitly specify public_key, private_key, project_id in the json file.
Writing a JSON File
Let's take building a custom image with nginx installed as an example. First, create a clean empty folder as the workspace, and switch to this directory, write a JSON specification file (e.g., test.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`}}"
},
"builders": [
{
"type": "ucloud-uhost",
"public_key": "{{user `ucloud_public_key`}}",
"private_key": "{{user `ucloud_private_key`}}",
"project_id": "{{user `ucloud_project_id`}}",
"region": "cn-bj2",
"availability_zone": "cn-bj2-02",
"instance_type": "n-basic-2",
"source_image_id": "uimage-f1chxn",
"ssh_username": "root",
"image_name": "packer-test-basic-bj"
}
],
"provisioners": [
{
"type": "shell",
"inline": [
"yum install -y nginx"
]
}
]
}
The above defines a UCloud-Global-uhost Builders builder and a provisioners configurator (opens in a new tab). By executing the command packer build test.json, a custom image can be built with one click.