使用Packer構建映象

leason001發表於2024-08-21

什麼是Packer

Packer 是一個強大的工具,它可以幫助我們輕鬆地構建各種型別的映象,如虛擬機器映象、Docker 映象等。

Packer 的工作原理是透過定義一個配置檔案,該檔案描述了要構建的映象的特徵和要求。然後 Packer 使用這個配置檔案來執行一系列的步驟,例如安裝必要的軟體、配置系統設定、複製檔案等,最終生成一個可用的映象。

為什麼要用 Packer

使用 Packer 構建映象的好處是多方面的。

  1. 可移植性:首先,它提供了一種可重複的、自動化的方式來建立映象,這意味著我們可以確保每次構建的映象都是一致的,從而減少了人為錯誤的風險。其次,Packer 支援多種基礎設施提供商,如 AWS、VMware、Azure 等,這使得我們可以在不同的環境中輕鬆地部署映象。
  2. 自動化:Packer 依據單個的配置檔案, 能做到流水線式 + 併發的建立映象,與傳統手工操作相比,其 "Infrastructure as Code" 的工作方式也大大減少了失誤的機率。
  3. 問題的追溯與定位:在 Packer 上所有變化都是基於程式碼的,而程式碼是可以追溯的,方便快速定位問題並回滾。而在傳統方式中,考慮到手動操作的過程可能涉及多人,完整地追出問題並不是一件容易的事兒。
  4. 快速迭代:Packer 的配置檔案是可編輯的,因此我們可以輕鬆地修改配置檔案,然後重新構建映象,從而快速迭代。

Packer的組成及及原理

Packer包含構建器(Builder),(派生器)Provisioner,(後處理器)Post-Processor三個元件,透過JSON格式的模板檔案,可以靈活的組合這三種元件並行的、自動化的建立多平臺一致的映象檔案。為單個平臺生成映象的單個任務稱為構建,而單個構建的結果也稱為工件(Artifact),多個構建可以並行執行。

  • Builder又稱構建器,能夠為單個平臺建立映象。構建器讀取一些配置並使用它來執行和生成映象。作為構建的一部分呼叫構建器以建立實際生成的映象。常見的構建器包括VirtualBox,Alicloud ECS和Amazon EC2。構建器可以以外掛的形式建立並新增到Packer中。
  • Provisioner(派生器),這一元件在Buider建立的執行的機器中安裝和配置軟體。他們執行使映象包含有用軟體的主要工作。常見的派生器包括shell指令碼,Chef,Puppet等。
  • Post-Processors(後處理器),它使用構建器或另一個後處理器的結果來建立新工件的過程。例如壓縮後處理器壓縮工件,上傳後處理器上傳工件等。

落地

  1. 透過qemu-kvm本地構建映象
  2. 透過gitlab倉庫管理映象構建的引數配置模板
  3. 透過gitops觸發構建,跟蹤構建日誌以及構建結果(提交模板變更merge request,透過評論觸發構建任務)
工具 版本 說明
Packer 1.9.4 官方文件
Packer-plugin-qemu 1.0.10 Packer 外掛
qemu-kvm 7.0.0 QEMU 7.0.0

file

模板

packer {
  required_plugins {
    qemu = {
      source  = "github.com/hashicorp/qemu"
      version = ">= 1.0.10"
    }
  }
}

variable "checksum" {
  type    = string
  default = "xxxxxxx"
}

variable "ssh_password" {
  type    = string
  default = "xxxxx"
}

source "qemu" "autogenerated_1" {
  accelerator          = "kvm"
  boot_command         = ["<tab> inst.text ", "console=ttyS0,115200n8 ", "inst.ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks/rocky9.ks ", "nameserver=1.1.1.1 ", "<enter><wait> "]
  boot_wait            = "0s"
  communicator         = "ssh"
  format               = "qcow2"
  headless             = true
  iso_checksum         = "sha256:${var.checksum}"
  iso_url              = "../../../Rocky-9.2-x86_64-minimal.iso"
  qemu_binary          = "/usr/libexec/qemu-kvm"
  qemuargs             = [["-m", "4096"], ["-smp", "2,sockets=2,cores=1,threads=1"], ["-cpu", "host"], ["-serial", "file:serial.out"]]
  shutdown_command     = "/sbin/halt -h -p"
  shutdown_timeout     = "120m"
  ssh_password         = "${var.ssh_password}"
  ssh_timeout          = "1500s"
  ssh_username         = "root"
  http_content = {
      "/ks/rocky9.ks"     = file("../../kickstart/rocky9.ks")
    }
}

build {
  description = "\tMinimal Rockylinux 9 Qemu Imageni\n__________________________________________"

  sources = ["source.qemu.autogenerated_1"]

  provisioner "shell" {
    script = "./provisioner.sh"
  }
  
#  provisioner "file" {   // 複製配置檔案
#    destination = "/etc/cloud/cloud.cfg"
#    source      = "../../resource/cloud.cfg"
#  }

}

配置庫組織形式

  1. 配置倉庫模板化了kickstart檔案(這個部分往往是不經常變動的)
  2. 對於不同映象的模板檔案放在不同的目錄下,方便管理
  3. 同一個映象目錄下三個檔案
    1. packer的hcl檔案(packer模板主檔案)
    2. provisioner.sh 製備過程中指令碼,映象中需要安裝的包,修改的檔案等等
    3. env.yaml 為了聯動DevOps系統的一些配置,比如標識當前這個映象的版本、型別、用途等等
  4. resources 目錄主要存放一些資原始檔,如配置檔案,指令碼等等

├── kickstart        # kickstart 配置檔案存放目錄
│   ├── rocky9.ks
├── packer           # 不同版本映象模板檔案
│   ├── rocky9
│   │   ├── rocky9.pkr.hcl
│   │   ├── provisioner.sh  # 製備過程中指令碼,安裝包,修改核心引數等等
│   │   ├── env.yaml   # 系統一些配置,如os_type,os_version
│   ├── centos7 
│   │   ├── centos7.pkr.hcl
│   │   ├── provisioner.sh
│   │   ├── env.yaml   # 系統一些配置,如os_type,os_version
├── resources        # 一些資原始檔,配置檔案可以直接cpoy過去

效果

file
file

好處

  1. 提升構建映象自動化程度,提升效率:以往運維同學手動到雲上打映象得到映象ID然後配置到DevOps系統中
  2. 映象版本可以描述,版本可追溯,更透明:以往的映象版本都是透過人工打的,過段時間沒人知道當前執行的映象裡面做了哪些改動,裝了哪些東西,具有什麼特性

相關文章