在介紹Packer之前,先來回顧一下未使用Packer時自定義虛擬機器映象的步驟。先在本地啟動一個虛擬機器,從安裝系統開始,再進行自定義配置或應用安裝,最後封裝壓縮成映象,詳細操作步驟可以參考我之前寫的文件,製作Centos 7映象:https://robin-2016.github.io/2019/04/08/製作openstack的centos7映象/,製作Windows映象:https://robin-2016.github.io/2019/04/23/製作openstack的windows-server-2016映象/。還可以藉助阿里雲或華為雲等公有云,可以直接執行一個虛擬機器例項,再進行相關配置,最後匯出映象,使用公有云相比本地構建映象節省了安裝系統的時間,相關雲配置也能減少,只需進行自定義相關配置。
不論在本地還是在雲上構建虛擬機器映象,都需要很多手動操作步驟,而Packer就是為了構建映象自動化,和Terraform一樣都是HashiCorp公司出品,官網地址:https://www.packer.io/,在官網首頁還提出了映象即程式碼(Images as code)的概念,支援虛擬機器和容器映象構建,我體驗了一下容器構建過程,相比dockerfile略顯複雜難懂,推薦容器映象還是寫dockerfile,用Packer來構建虛擬機器映象,容器構建之前已經實現了自動化,虛擬機器映象構建還是手動操作,Packer能大大提高效率。下面進入實操演示。
Packer安裝,參考官網:https://developer.hashicorp.com/packer/install,基本1-2條命令就能完成安裝,示例配置檔案程式碼倉庫:https://github.com/robin-2016/terraform-demo,克隆後進行packer-demo目錄下
先來看一下aws-demo.pkr.hcl配置檔案內容結構,第一部分packer部分定義了使用的外掛,這裡使用的AWS雲,AWS第一次註冊使用有750小時免費使用計劃(限定規格)。第二部分source部分定義了映象來源,amazon-ebs標識是AWS的雲硬碟,ami_name為最終生成的映象名稱,{{timestamp}}為時間戳變數,多次執行時映象名稱會因為執行時間不同而不同,不會名稱衝突,instance_type為虛擬機器例項規格,其實Packer底層原理還是建立了一個虛擬機器例項,執行指令碼命令,匯出映象,再刪除虛擬機器例項,Packer是把上面步驟自動化了,region為例項執行區域,ap-east-1是香港地區,source_ami為基礎映象ID,這裡選擇的公有Ubuntu Server 24映象。第三部分build是定義構建過程,主要是shell部分,可以寫指令碼來安裝配置應用程式,示例中是安裝的redis程式。
packer {
required_plugins {
amazon = {
version = ">= 1.2.8"
source = "github.com/hashicorp/amazon"
}
}
}
source "amazon-ebs" "ubuntu" {
ami_name = "aws-demo-ubuntu-{{timestamp}}"
instance_type = "t3.micro"
region = "ap-east-1"
source_ami = "ami-0ad7f83eab34d93a7"
ssh_username = "ubuntu"
}
build {
name = "learn-packer"
sources = [
"source.amazon-ebs.ubuntu"
]
provisioner "shell" {
environment_vars = [
"FOO=hello world",
]
inline = [
"echo Installing Redis",
"sleep 30",
"sudo apt-get update",
"sudo apt-get install -y redis-server",
"echo \"FOO is $FOO\" > example.txt",
]
}
}
在具體執行前先配置下面兩個環境變數,AWS的AK和SK,Packer會讀取環境變數就能有許可權操作AWS了。
export AWS_ACCESS_KEY_ID="<YOUR_AWS_ACCESS_KEY_ID>"
export AWS_SECRET_ACCESS_KEY="<YOUR_AWS_SECRET_ACCESS_KEY>"
依次執行下面命令,就能完成映象的構建了,先進行初始化,格式化和驗證配置檔案命令是可選的,最後進行映象構建,操作看著和Terraform非常相似。
#初始化
packer init .
#格式化配置-可選
packer fmt .
#驗證配置-可選
packer validate .
#構建映象
packer build aws-demo.pkr.hcl
等待構建命令執行完成,映象就構建完成了,可以登入進入到AWS的映象服務,就能看到本次Packer構建的映象了,演示完成後如不需要記得手動刪除映象。
本示例構建映象過程耗時大約5分鐘,相比之前手動操作效率提高不少,還可以把配置檔案新增到程式碼倉庫中,同程式碼一起進行版本管理,和Jenkins等工具結合,實現流水線構建映象,AWS支援Windows映象,需要使用Powershell指令碼,參考官網文件:https://developer.hashicorp.com/packer/integrations/hashicorp/amazon/latest/components/builder/ebs#windows-2016-sysprep-commands-for-amazon-windows-amis-only。
AWS支援並行構建多個映象,參考官網文件:https://developer.hashicorp.com/packer/tutorials/aws-get-started/aws-get-started-parallel-builds
Packer官方供應商還支援阿里雲、騰訊雲和OpenStack,沒有華為雲,但在華為雲自己的文件中有使用Packer構建映象文件,參考連結:https://support.huaweicloud.com/bestpractice-ims/ims_bp_0031.html,在阿里雲、騰訊雲和華為雲中沒有看到對Windows映象支援的文件,對比來看,還是AWS使用文件最詳細。
Packer介紹和演示到此結束,如果對你有幫助,請點個關注,嘿嘿。