--- description: | The `ucloud-uhost` Packer builder plugin provides the capability to build customized images based on an existing base image for use in UHost Instance. layout: docs page_title: UCloud Image Builder sidebar_title: UCloud --- # UCloud Image Builder Type: `ucloud-uhost` The `ucloud-uhost` Packer builder plugin provides the capability to build customized images based on an existing base image for use in UHost Instance. This builder builds an UCloud image by launching an UHost instance from a source image, provisioning that running machine, and then creating an image from that machine. ## Configuration Reference The following configuration options are available for building UCloud images. They are segmented below into two categories: required and optional parameters. In addition to the options listed here, a [communicator](/docs/templates/communicator) can be configured for this builder. ~> **Note:** The builder doesn't support Windows images for now and only supports CentOS and Ubuntu images via SSH authentication with `ssh_username` (Required) and `ssh_password` (Optional). The `ssh_username` must be `root` for CentOS images and `ubuntu` for Ubuntu images. The `ssh_password` may contain 8-30 characters, and must consist of at least 2 items out of the capital letters, lower case letters, numbers and special characters. The special characters include `()~!@#\$%^&\*-+=\_|{}\[]:;'<>,.?/`. ### Required: @include 'builder/ucloud/common/AccessConfig-required.mdx' @include 'builder/ucloud/common/RunConfig-required.mdx' @include 'builder/ucloud/common/ImageConfig-required.mdx' ### Optional: @include 'builder/ucloud/common/AccessConfig-not-required.mdx' @include 'builder/ucloud/common/RunConfig-not-required.mdx' @include 'builder/ucloud/common/ImageConfig-not-required.mdx' ## Examples Here is a basic example for build UCloud CentOS image: ```json { "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{{timestamp}}" } ] } ``` ```hcl // .pkr.hcl file variable "ucloud_public_key" { type = string default = "xxx" } variable "ucloud_private_key" { type = string default = "xxx" } variable "ucloud_project_id" { type = string default = "xxx" } source "ucloud-uhost" "basic-example" { public_key = var.ucloud_public_key private_key = var.ucloud_private_key project_id = var.ucloud_project_id region = "cn-bj2" availability_zone = "cn-bj2-02" instance_type = "n-basic-2" source_image_id = "uimage-f1chxn" ssh_username = "root" } build { source "sources.ucloud-uhost.basic-example" { image_name = "packer-test-${timestamp()}" } } ``` Here is a example for build UCloud Ubuntu image: ```json { "variables": { "ucloud_public_key": "{{env `UCLOUD_PUBLIC_KEY`}}", "ucloud_private_key": "{{env `UCLOUD_PRIVATE_KEY`}}", "ucloud_project_id": "{{env `UCLOUD_PROJECT_ID`}}", "password": "ucloud_2020" }, "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-irofn4", "ssh_password": "{{user `password`}}", "ssh_username": "ubuntu", "image_name": "packer-test-ubuntu{{timestamp}}" } ], "provisioners": [ { "type": "shell", "execute_command": "echo '{{user `password`}}' | sudo -S '{{.Path}}'", "inline": ["sleep 30", "sudo apt update", "sudo apt install nginx -y"] } ] } ``` ```hcl // .pkr.hcl file variable "ucloud_public_key" { type = string default = "xxx" } variable "ucloud_private_key" { type = string default = "xxx" } variable "ucloud_project_id" { type = string default = "xxx" } variable "password" { type = string default = "ucloud_2020" } source "ucloud-uhost" "basic-example" { public_key = var.ucloud_public_key private_key = var.ucloud_private_key project_id = var.ucloud_project_id region = "cn-bj2" availability_zone = "cn-bj2-02" instance_type = "n-basic-2" ssh_password = var.password source_image_id = "uimage-irofn4" ssh_username = "ubuntu" } build { source "sources.ucloud-uhost.basic-example" { image_name = "packer-test-ubuntu-${timestamp()}" } provisioner "shell" { execute_command = "echo '${var.password}' | sudo -S '{{.Path}}'" inline = ["sleep 30", "sudo apt update", "sudo apt install nginx -y"] } } ``` -> **Note:** Packer can also read the public key and private key from environmental variables. See the configuration reference in the section above for more information on what environmental variables Packer will look for. ~> **Note:** Source image may be deprecated after a while, you can use the tools like [UCloud CLI](https://docs.ucloud.cn/cli/intro) to run `ucloud image list` to find one that exists.