Packer 是一個便捷的建立本地鏡像的開源工具,能運行在大多數主流作業系統上。

自行建立本地鏡像並上傳到雲平台是一個非常繁複的過程,此處示範了如何在 Ubuntu 16.04 伺服器中建立 CentOS 6.9 本地鏡像並上傳到阿里雲雲平台,如果您需要製作其他動作系統類別型的鏡像,請根據需要 自訂 Packer 模板。

前提條件

  • 您已經 建立 AccessKey,用於輸出到設定檔 centos.json 裡。
    说明
    由於 AccessKey 許可權過大,為防止資料泄露,建議您创建RAM用户 ,並使用 RAM 使用者子帳號 建立 AccessKey
  • 您已經 開通OSS服務,便於上傳鏡像檔案到雲平台。

使用樣本

  1. 運行 egrep "(svm|vmx)" /proc/cpuinfo 確保您的原始伺服器或者虛擬機器是否支援 KVM。當返回下列資訊時,表示支援 KVM。
    
    pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf tsc_known_freq pni pclmulqdq dtes64 monitor ds_cpl vmx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 xsaves dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp
    flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov
  2. 若您的原始伺服器或者虛擬機器支援 KVM,運行以下命令安裝 KVM。
    
    sudo apt-get install qemu-kvm qemu virt-manager virt-viewer libvirt-bin bridge-utils #安裝 KVM 及相關控制項。
    sudo virt-manager #開啟 virt-manager。

    如果可以通過 GUI 建立虛擬機器,表示您已經成功安裝 KVM。

  3. 安裝 Packer。

    您可以參閱 使用Packer建立自訂鏡像 部分內容安裝 Packer。

  4. 依次執行以下命令定義 Packer 模板:
    说明
    以下樣本製作的本地鏡像基於 CentOS 6.9 作業系統,如果您需要建立其他類型作業系統的鏡像,您可以根據需要自訂 Packer 模板設定檔 centos.json。
    
    cd /user/local #切換所在目錄。
    wget https://raw.githubusercontent.com/alibaba/packer-provider/master/examples/alicloud/local/centos.json #下載阿里雲官方發行的 centos.json 設定檔。
    wget https://raw.githubusercontent.com/alibaba/packer-provider/master/examples/alicloud/local/http/centos-6.9/ks.cfg #下載阿里雲官方發行的 ks.cfg 設定檔。
    mkdir -p http/centos-6.9 #建立目錄。
    mv ks.cfg http/centos-6.9/ #移動檔案 ks.cfg 到目錄 http/centos-6.9 中。
  5. 依次執行以下命令建立本地鏡像。
    
    export ALICLOUD_ACCESS_KEY=您的 AccessKeyID #匯入您的 AccessKeyID。
    export ALICLOUD_SECRET_KEY=您的 AccessKeySecret #匯入您的 AccessKeySecret。
    packer build centos.json #建立本地鏡像。

    樣本運行結果如下:

    
    qemu output will be in this color.
    ==> qemu: Downloading or copying ISO
    qemu: Downloading or copying: http://mirrors.aliyun.com/centos/6.9/isos/x86_64/CentOS-6.9-x86_64-minimal.iso
    ................................................
    ==> qemu: Running post-processor: alicloud-import
    qemu (alicloud-import): Deleting import source https://oss-cn-beijing.aliyuncs.com/packer/centos_x86_64
    Build 'qemu' finished.
    ==> Builds finished. The artifacts of successful builds are:
    --> qemu: Alicloud images were created:
    cn-beijing: XXXXXXXX
  6. 等待一段時間後,在對應地域的 ECS 控制台鏡像詳情頁 查看上傳結果,如樣本中的華北二。

後續操作

您可以使用該自訂鏡像建立 ECS 執行個體,具體步驟參閱 使用自訂鏡像建立執行個體

自訂 Packer 模板

以上 使用樣本 製作的本地鏡像基於 CentOS 6.9 作業系統,如果您需要建立其他類型作業系統的鏡像,您可以根據需要自訂 Packer 模板。

例如,以下 JSON 檔案是基於 Packer 模板生成的,用於建立 CentOS 6.9 鏡像。


{"variables": {
"box_basename": "centos-6.9",
"build_timestamp": "{{isotime \"20060102150405\"}}",
"cpus": "1",
"disk_size": "4096",
"git_revision": "__unknown_git_revision__",
"headless": "",
"http_proxy": "{{env `http_proxy`}}",
"https_proxy": "{{env `https_proxy`}}",
"iso_checksum_type": "md5",
"iso_checksum": "af4a1640c0c6f348c6c41f1ea9e192a2",
"iso_name": "CentOS-6.9-x86_64-minimal.iso",
"ks_path": "centos-6.9/ks.cfg",
"memory": "512",
"metadata": "floppy/dummy_metadata.json",
"mirror": "http://mirrors.aliyun.com/centos",
"mirror_directory": "6.9/isos/x86_64",
"name": "centos-6.9",
"no_proxy": "{{env `no_proxy`}}",
"template": "centos-6.9-x86_64",
"version": "2.1.TIMESTAMP"
},
"builders":[
{
"boot_command": [
" text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/{{user `ks_path`}}"
],
"boot_wait": "10s",
"disk_size": "{{user `disk_size`}}",
"headless": "{{ user `headless` }}",
"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 'vagrant'|sudo -S /sbin/halt -h -p",
"ssh_password": "vagrant",
"ssh_port": 22,
"ssh_username": "root",
"ssh_wait_timeout": "10000s",
"type": "qemu",
"vm_name": "{{ user `template` }}.raw",
"net_device": "virtio-net",
"disk_interface": "virtio",
"format": "raw"
}
],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"yum install cloud-util cloud-init -y"
]
}],
"post-processors":[
{
"type":"alicloud-import",
"oss_bucket_name": "packer",
"image_name": "packer_import",
"image_os_type": "linux",
"image_platform": "CentOS",
"image_architecture": "x86_64",
"image_system_size": "40",
"region":"cn-beijing"
}
]
}
Packer 產生器參數說明

使用樣本 中使用的產生器為 QEMU Builder,該產生器用於建立虛擬機器鏡像。其必需參數如下所示。

必需參數 類型 描述
iso_checksum string 作業系統的 ISO 檔案的校驗和。Packer 在啟動掛載了 ISO 的虛擬機器之前檢查該參數。至少指定 iso_checksum 或者 iso_checksum_url 參數;當您指定了參數iso_checksum時,參數 iso_checksum_url 的值被自動忽略。
iso_checksum_type string 已指定的作業系統的 ISO 檔案的校驗和類型。取值範圍:
  • none:忽略校驗和過程。不推薦指定該值
  • md5
  • sha1
  • sha256
  • sha512
iso_checksum_url string 一個包含了作業系統 ISO 檔案校驗和的檢驗和檔案的連結(URL),樣式為 GNU 或者 BSD。您需要至少指定 iso_checksum 或者 iso_checksum_url 參數;當您指定了參數iso_checksum時,參數 iso_checksum_url 的值被自動忽略。
iso_url string 一個指向 ISO 並包含安裝鏡像的 URL。這個 URL 可以是一個 HTTP 連結,也可以是一個檔案路徑:
  • 如果是 HTTP 連結,Packer 從 HTTP 連結下載檔案並緩存運行。
  • 如果是 IMG 或者 QCOW2 檔案 連結,QEMU直接在檔案基礎上啟動。當您指定了檔案路徑時,請將參數 disk_image 置為 true
headless boolean Packer 預設通過啟動圖形化虛擬機器介面構建 QEMU 虛擬機器。當您將 headless 置為 True 時,將啟動一個沒有控制台的虛擬機器。

其餘選擇性參數可參閱 Packer QEMU Builder 頁面。

Packer 配置器部分參數說明

使用樣本 中使用的配置器中包含了 Post-Processor 模組,該模組實現自動化上傳本地鏡像到 ECS 雲平台。Post-Processor 模組的必需參數如下所示。

必需參數 類型 描述
access_key string 您的 AccessKeyID。由於 AccessKey 許可權過大,為防止資料泄露,建議您创建RAM用户 ,並使用 RAM 使用者子帳號 建立 AccessKey
secret_key string 您的 AccessKeySecret。由於 AccessKey 許可權過大,為防止資料泄露,建議您创建RAM用户,並使用 RAM 使用者子帳號 建立 AccessKey
region string 本地鏡像上傳的地域,如本樣本中的 cn-beijing。請參閱 地域和可用性區域查看更多地域資訊。
image_name string 您的本地鏡像的名稱。
  • 由 [2, 128] 位英文或中文字元組成。
  • 必須以大小寫字母或中文字元開始。
  • 可以包含數字、底線(_)或者連字號(-)。
  • 不能以 http:// or https:// 開頭。
oss_bucket_name string 您的 OSS Bucket 名稱。若您指定了一個不存在的 Bucket 名稱,Packer 上傳鏡像時自動建立一個同名 Bucket。
image_os_type string 鏡像類型,取值範圍:
  • linux
  • windows
image_platform string 鏡像發行版本,如本樣本中的 CentOS。
image_architecture string 鏡像發行版本的架構平台,取值範圍:
  • i386
  • x86_64
format string 鏡像的格式,取值範圍:
  • RAW
  • VHD

其餘選擇性參數可參閱 Packer Alicloud Post-Processor 頁面。

下一步

您可以使用該鏡像建立 ECS 執行個體,參閱 使用自訂鏡像建立執行個體

參考連結

  • 您可以參閱 Packer 官方文檔 瞭解 Packer 使用詳情。
  • 您可以訪問 GitHub Packer 倉庫 packer 獲取更多資訊。
  • 您可以訪問 GitHub Alibaba 倉庫 opstools 獲取更多資訊。
  • 您可以訪問 GitHub Alibaba&Packer 倉庫 packer-provider 獲取更多資訊。
  • 您可以參閱 Anaconda Kickstart 瞭解設定檔 ks.cfg 的更多資訊。