全部產品
Search
文件中心

Elastic Compute Service:使用Packer建立自訂鏡像

更新時間:Feb 28, 2024

Packer是一款輕量級的鏡像定義工具,能夠運行在常用的主流作業系統(例如Windows、Linux和macOS)上,並行高效地建立多平台的虛擬機器鏡像。本文為您介紹如何在ECS執行個體中安裝Packer、定義Packer模板並使用Packer建立自訂鏡像。

前提條件

已建立AccessKey,並擷取AccessKey ID和AccessKey Secret。具體操作,請參見建立AccessKey

說明
  • 由於AccessKey許可權過大,為防止資料泄露,建議您先建立RAM使用者,再使用RAM使用者建立AccessKey。建立RAM使用者的具體操作,請參見建立RAM使用者

  • RAM使用者的AccessKey Secret只在建立時顯示,不支援查看,請妥善保管。

背景資訊

Packer工具包含Builders(產生器)Provisioners(配置器)Post-Processors(後處理器)等組件,通過HCL(HashiCorp Configuration Language)或者JSON格式的模板檔案較大地降低了建立自訂鏡像的難度,並且將建立鏡像的過程從人工的隨機過程變成可以組態管理代碼,從而減少了使用者應用上雲的障礙。

操作步驟

步驟一:安裝Packer

  1. 遠端連線ECS執行個體。

  2. 運行以下命令,進入/usr/local/bin目錄。

    cd /usr/local/bin
    說明

    /usr/local/bin目錄為環境變數目錄,您可以將Packer安裝到該目錄下或其他已添加到環境變數的目錄下。

  3. 運行以下命令,擷取Packer安裝包。

    您也可以訪問Packer下載頁面擷取與Elastic Compute Service作業系統及架構類型相對應的Packer安裝包,本操作以packer_1.8.5_linux_amd64.zip為例。

    wget https://releases.hashicorp.com/packer/1.8.5/packer_1.8.5_linux_amd64.zip
  4. 運行以下命令,解壓Packer安裝包。

    unzip packer_1.8.5_linux_amd64.zip
  5. 運行以下命令查詢Packer版本號碼,驗證Packer的安裝狀態。

    packer -v
    • 如果返回Packer版本號碼,表示您已正確安裝Packer。

    • 如果返回資訊提示command not found,表示Packer未正確安裝,請檢查Packer所在目錄是否被添加到環境變數中。

步驟二:定義Packer模板

使用Packer建立自訂鏡像時,需要建立一個HCL格式或者JSON格式的模板檔案。在該模板檔案中,您需要指定建立自訂鏡像的產生器和配置器。更多資訊,請參見Builders(產生器)Provisioners(配置器)。Packer具有多種配置器類型可用於配置自訂鏡像的內容產生方式,以下操作以常用的Shell配置器為例,定義Packer模板。

  1. 運行以下命令,匯入您的AccessKey ID。

    export ALICLOUD_ACCESS_KEY=<AccessKey ID>

    請將<AccessKey ID>替換為您實際的AccessKey ID。查詢RAM使用者AccessKey ID的具體操作,請參見查看RAM使用者的AccessKey資訊

  2. 運行以下命令,匯入您的AccessKey Secret。

    export ALICLOUD_SECRET_KEY=<AccessKey Secret>

    請將<AccessKey Secret>替換為您實際的AccessKey Secret。RAM使用者的AccessKey Secret只在建立時顯示,不支援查詢。更多資訊,請參見建立AccessKey

  3. 運行以下命令,建立名為alicloud的檔案。

    說明

    您可以選擇以下任意一種檔案格式來建立alicloud檔案,如果建立HCL格式的檔案,後續就需要按照HCL模板來執行。

    HCL檔案

    vi alicloud.pkr.hcl

    JSON檔案

    vi alicloud.json
  4. i鍵進入編輯模式,並根據實際情況修改以下自訂參數後粘貼內容到alicloud檔案中。

    HCL檔案

    variable "access_key" {
      type    = string
      default = "${env("ALICLOUD_ACCESS_KEY")}"
    }
    
    variable "secret_key" {
      type    = string
      default = "${env("ALICLOUD_SECRET_KEY")}"
    }
    
    source "alicloud-ecs" "autogenerated_1" {
      associate_public_ip_address = true
      image_name                  = "packer_basic"
      instance_type               = "ecs.g6.large"
      internet_charge_type        = "PayByTraffic"
      io_optimized                = true
      region                      = "cn-qingdao"
      skip_image_validation       = true
      source_image                = "aliyun_3_x64_20G_alibase_20220907.vhd"
      ssh_username                = "root"
    }
    
    build {
      sources = ["source.alicloud-ecs.autogenerated_1"]
      provisioner "shell" {
        inline = ["sleep 30", "yum install redis.x86_64 -y"]
      }
    }

    JSON檔案

    {
         "variables": {
           "access_key": "{{env `ALICLOUD_ACCESS_KEY`}}",
           "secret_key": "{{env `ALICLOUD_SECRET_KEY`}}"
         },
         "builders": [{
           "type":"alicloud-ecs",
           "region":"cn-qingdao",
           "image_name":"packer_basic",
           "source_image":"aliyun_3_x64_20G_alibase_20220907.vhd",
           "associate_public_ip_address":true,
           "ssh_username":"root",
           "instance_type":"ecs.g6.large",
           "internet_charge_type":"PayByTraffic",
     "io_optimized":true,
           "skip_image_validation":true
         }],
         "provisioners": [{
           "type": "shell",
           "inline": [
             "sleep 30",
             "yum install redis.x86_64 -y"
           ]
         }]
       }

    您需要自訂的參數值如下表所示。

    參數

    描述

    region

    指定建立自訂鏡像時使用臨時資源的地區,例如cn-qingdao

    image_name

    指定建立的自訂鏡像名稱,例如packer_basic

    source_image

    基礎鏡像的名稱,該鏡像用於建立臨時ECS執行個體。可以從ECS控制台公用鏡像列表獲得,也可以通過DescribeImages介面查詢獲得。

    重要

    配置時需注意所選鏡像類型需支援ECS執行個體的類型,例如ARM鏡像(鏡像ID攜帶_arm64_)需選用ARM類型的執行個體,否則無法成功建立自訂鏡像。

    instance_type

    建立自訂鏡像時產生的臨時ECS執行個體的類型,例如ecs.g6.large規格。鏡像建立完成後,該執行個體會被自動釋放。

    說明

    使用Packer建立自訂鏡像過程中,會調用CreateInstance介面建立ECS執行個體,該執行個體包含了用於建立自訂鏡像的作業系統和預裝軟體等。該執行個體類型為隨用隨付,因此會產生部分費用。

    internet_charge_type

    建立自訂鏡像時臨時執行個體的公網頻寬付費類型。

    • PayByBandwidth:按固定頻寬計費。

    • PayByTraffic:按使用流量計費。

    provisioners

    建立自訂鏡像時使用的Packer配置器類型。主要包括:

    • File

    • PowerShell

    • Shell

    • Local Shell

    • Windows Shell

    更多資訊,請參見Provisioners(配置器)

  5. Esc鍵,並輸入:wq後按下斷行符號鍵,儲存並退出。

步驟三:使用Packer建立自訂鏡像

使用Packer模板檔案產生自訂鏡像的操作步驟如下:

  1. 運行以下命令,建立自訂鏡像。

    HCL檔案

    packer build alicloud.pkr.hcl

    樣本運行結果如下,以下樣本表示將在華北1(青島)地區建立鏡像ID為m-m5e3f0gu2dxs4z0s****的自訂鏡像。

    alicloud-ecs.autogenerated_1: output will be in this color.
    
    ==> alicloud-ecs.autogenerated_1: Prevalidating source region and copied regions...
    ==> alicloud-ecs.autogenerated_1: Prevalidating image name...
        alicloud-ecs.autogenerated_1: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd
    ==> alicloud-ecs.autogenerated_1: Creating temporary keypair: packer_64bf3d40-2fe7-8251-276d-df59a0bb****
    ---------------------------
    ==> alicloud-ecs.autogenerated_1: Provisioning with shell script: /tmp/packer-shell3356722207
        alicloud-ecs.autogenerated_1: Last metadata expiration check: 0:00:11 ago on Tue 25 Jul 2023 11:12:18 AM CST.
    ---------------------------
        alicloud-ecs.autogenerated_1: Complete!
    ==> alicloud-ecs.autogenerated_1: Stopping instance: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Waiting instance stopped: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Creating image: packer_basic
        alicloud-ecs.autogenerated_1: Detach keypair packer_64bf3d40-2fe7-8251-276d-df59a0bb**** from instance: i-m5e87pt498pr8zv0****
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'EIP'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'instance'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'security group'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'vSwitch'
    ==> alicloud-ecs.autogenerated_1: Cleaning up 'VPC'
    ==> alicloud-ecs.autogenerated_1: Deleting temporary keypair...
    Build 'alicloud-ecs.autogenerated_1' finished after 4 minutes 32 seconds.
    
    ==> Wait completed after 4 minutes 32 seconds
    
    ==> Builds finished. The artifacts of successful builds are:
    --> alicloud-ecs.autogenerated_1: Alicloud images were created:
    
    cn-qingdao: m-m5e3f0gu2dxs4z0s****

    JSON檔案

    packer build alicloud.json

    樣本運行結果如下,以下樣本表示將在華北1(青島)地區建立鏡像ID為m-m5e3f0gu2dxs4z0s****的自訂鏡像。

    alicloud-ecs output will be in this color.
    
    ==> alicloud-ecs: Prevalidating image name...
        alicloud-ecs: Found image ID: aliyun_3_x64_20G_alibase_20220907.vhd
    ==> alicloud-ecs: Creating temporary keypair: packer_6345090e-ec1f-8ea0-348c-f85ba047****
    ==> alicloud-ecs: Creating vpc
    ---------------------------
    ==> alicloud-ecs: Provisioning with shell script: /tmp/packer-shell090019677
        alicloud-ecs: Last metadata expiration check: 0:00:15 ago on Tue 11 Oct 2022 02:12:51 PM CST.
    ---------------------------
        alicloud-ecs: Complete!
    ==> alicloud-ecs: Deleting image snapshots.
    ==> alicloud-ecs: Creating image: packer_basic
        alicloud-ecs: Detach keypair packer_6345090e-ec1f-8ea0-348c-f85ba047**** from instance: i-m5e7it5p4dpwetfr****
    ==> alicloud-ecs: Cleaning up 'EIP'
    ==> alicloud-ecs: Cleaning up 'instance'
    ==> alicloud-ecs: Cleaning up 'security group'
    ==> alicloud-ecs: Cleaning up 'vSwitch'
    ==> alicloud-ecs: Cleaning up 'VPC'
    ==> alicloud-ecs: Deleting temporary keypair...
    Build 'alicloud-ecs' finished.
    
    ==> Builds finished. The artifacts of successful builds are:
    --> alicloud-ecs: Alicloud images were created:
    
    cn-qingdao: m-m5e3f0gu2dxs4z0s****
  2. 查看已建立的自訂鏡像。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇執行個體與鏡像 > 鏡像

    3. 在頂部功能表列左上方處,選擇alicloud檔案中指定的地區,例如華北1(青島)。

    4. 自訂鏡像頁簽下,鏡像列表中查看產生的名稱為packer_basic的自訂鏡像。