Skip to content

Packer

跨平台映像檔自動建置工具

軟體分類 程式開發 / 自動化工具
開發廠商 HashiCorp
Stars
15.6k
Forks
3.3k
License
BUSL-1.1 (SOURCE AVAILABLE)
Version
v1.14.3
Update
2026-03-14
OS

產品說明

Packer 是由 HashiCorp 開發的開源(Source Available)工具,專門用於從單一設定檔自動建立適用於多種平台的機器映像檔(Machine Images)。在現代化的 DevOps 流程中,Packer 扮演著「黃金映像檔(Golden Image)」製造工廠的角色。

傳統上,維運人員可能需要手動安裝 OS、打 Patch、安裝軟體來製作一個 VM 範本。Packer 將這個過程程式碼化(Infrastructure as Code),讓你使用 HCL (HashiCorp Configuration Language) 語言定義伺服器的狀態。執行一次建置,就能同時產出 AWS AMI、VMware Template、Docker Image 與 VirtualBox Box,確保所有環境的底層系統完全一致。

核心特色:

  • 跨多雲平台支援:單一設定檔可同時輸出 AWS、Azure、GCP、DigitalOcean、VMware 等多種格式的映像檔。
  • Infrastructure as Code:使用 HCL 語法管理映像檔建置流程,支援版本控制、模組化與變數管理。
  • 自動化配置 (Provisioning):建置過程中可呼叫 Shell Script、Ansible、Chef、Puppet 等工具自動安裝軟體與設定環境。
  • 極速建置:支援並行建置(Parallel Builds),可同時為多個平台產出映像檔,大幅縮短等待時間。

常用指令

Packer 的操作流程通常分為:初始化專案 -> 驗證語法 -> 格式化程式碼 -> 執行建置。以下是日常開發最常用的指令:

基礎操作與範例

# 範例 1:初始化專案
# 下載設定檔中定義的 plugin (如 amazon, docker 等 builder)
packer init .

# 範例 2:驗證設定檔
# 檢查 HCL 語法是否正確,變數是否都有定義
packer validate .

# 範例 3:格式化程式碼
# 自動排版 HCL 檔案,保持程式碼風格一致 (類似 go fmt)
packer fmt .
# 範例 4:執行建置 (Build)
# 讀取設定檔並開始建立映像檔,預設會輸出所有定義的 source
packer build aws-ubuntu.pkr.hcl

# 範例 5:傳入變數進行建置
# 透過命令列覆蓋設定檔中的變數 (例如指定版本號)
packer build -var "version=1.0.0" -var "region=us-east-1" .

# 範例 6:除錯模式
# 在每個步驟暫停,讓開發者可以 SSH 進去檢查狀態
packer build -debug .
參數/指令功能說明對應操作
init初始化下載並安裝必要的 Plugins
build建置開始執行映像檔製作流程
validate驗證檢查設定檔語法與邏輯是否正確
fmt格式化自動調整 HCL 程式碼縮排與格式
inspect檢查查看 Template 中的元件依賴關係
console主控台進入互動模式測試變數與函數

設定檔範例 (HCL)

packer {
  required_plugins {
    amazon = {
      version = ">= 1.0.0"
      source  = "[github.com/hashicorp/amazon](https://github.com/hashicorp/amazon)"
    }
  }
}

source "amazon-ebs" "ubuntu" {
  ami_name      = "packer-linux-aws-demo"
  instance_type = "t2.micro"
  region        = "us-west-2"
  source_ami_filter {
    filters = {
      name                = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
      root-device-type    = "ebs"
      virtualization-type = "hvm"
    }
    most_recent = true
    owners      = ["099720109477"]
  }
  ssh_username = "ubuntu"
}

build {
  name    = "learn-packer"
  sources = [
    "source.amazon-ebs.ubuntu"
  ]
  
  provisioner "shell" {
    inline = [
      "echo Installing Redis...",
      "sudo apt-get update",
      "sudo apt-get install -y redis-server"
    ]
  }
}

操作介面