文章目录

Packer 是 HashiCorp 开源的自动化镜像构建工具,GitHub 星标超过 1.1 万。它能从一个配置文件自动在各个平台构建虚拟机镜像、容器镜像,一次配置多处能用,一致性有保证,现在做基础设施即代码经常和 Terraform 搭配用。
我用 Packer 打过 AWS AMI 镜像,确实比自己手动装软件拍快照靠谱,一模一样的配置每次打出来都一样,不会这次漏装依赖下次又错。今天聊聊它好用在哪。
Packer 解决了什么问题
以前做虚拟机镜像,你启动个虚拟机,手动装软件配环境,然后拍个快照当镜像,这过程太麻烦,下次更个新软件还得重来一遍。多平台还要给 AWS、Azure、GCP 各做一个,手动做三遍,出来镜像容易不一样,出问题都找不到。
Packer 用配置文件描述你要装什么软件怎么配,一条命令自动在各个平台帮你把镜像做好,全程不用手动点,一致性保证。镜像每次都是从零构建,不会留历史垃圾,干净得很。和 Terraform 配合,Packer 打镜像,Terraform 开机器,基础设施全代码化。
基础例子看一下
安装 Packer,下载二进制就能用:
bash
wget https://releases.hashicorp.com/packer/1.9.0/packer_1.9.0_linux_amd64.zip
unzip packer_1.9.0_linux_amd64.zip
mv packer /usr/local/bin/
写个简单配置,构建一个 AWS AMI 镜像,装个 Nginx:
hcl
source "amazon-ebs" "nginx" {
ami_name = "nginx-{{timestamp}}"
instance_type = "t2.micro"
region = "us-east-1"
source_ami_filter {
most_recent = true
owners = ["amazon"]
filter {
name = "name"
values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
}
}
}
build {
sources = ["source.amazon-ebs.nginx"]
provisioner "shell" {
inline = [
"apt-get update",
"apt-get install -y nginx",
]
}
}
格式化配置:
bash
packer fmt .
验证配置:
bash
packer validate .
开始构建:
bash
packer build .
等一会,Packer 自动启动实例、装 Nginx、做成 AMI 就好了,整个过程不用你管。做好之后直接用这个 AMI 开实例,Nginx 已经装好了。
核心特性
多平台支持
AWS、Azure、GCP、阿里云、Docker、VMware、Qemu 全都支持,一份配置同时打多个平台的镜像,不用每个平台各做一遍。
基础设施即代码
镜像配置写代码,存在 Git 里,版本管理,改了什么一目了然,谁改的什么时候改的,全知道。
预制软件
镜像里提前装好软件和依赖,实例启动就能用,不用启动再拉代码装依赖,启动快,部署时间短。
可重复一致
每次构建都是从零开始,按配置一步步来,保证每次出来的镜像一模一样,不会有差异,再也不会说"我这跑没问题啊"。
多种部署方式
shell、ansible、chef、puppet 都支持,你已经有配置脚本了直接用,不用重新写。
哪些场景用 Packer
提前做应用镜像,实例启动就带应用代码和依赖,启动快,适合弹性伸缩秒级扩缩容。多平台镜像构建,一份配置同时做 AWS、Azure、Docker 镜像,保证各个平台一致。
黄金镜像实践,公司内部做一个标准基础镜像,所有人都用这个,安全补丁提前打好,统一环境,减少差异。配合 Terraform,Packer 打镜像,Terraform 部署,全流程代码化。
Packer 有哪些优缺点
优点就是自动化,配置写好一次构建成功,后面一直用,省好多手动操作时间,一致性有保证。多平台支持好,主流平台全覆盖,不用换工具。HashiCorp 产品,和 Vagrant、Terraform 这些搭配无缝,生态好。文档清楚,跟着例子走一遍就能用。
缺点呢,第一次写配置得熟悉各个平台的参数,错了构建失败得重来,不过也不难。大镜像构建时间长,这也正常,毕竟从零开始装,反正是自动跑,不用你盯着。如果只是打个小容器镜像,直接 Dockerfile 够了,Packer 更适合虚拟机镜像。
现在 Packer 发展得怎么样
一直是 HashiCorp 维护,版本更新稳定,用户群体也稳定,现在做基础设施即代码的团队基本都会配着 Terraform 用,功能没啥大问题,一直慢慢更新。
现在学 Packer 值得吗
做运维做云原生开发,肯定值得学,你用 Terraform 做基础设施,用 Packer 做镜像刚好,全流程代码化,比手动做靠谱多了。
学起来不难,配置语法和 Terraform 一样都是 HCL,会 Terraform 看一眼就会写,常用功能半天就能摸清楚。打镜像这种事一次配置好之后一直用,投入一次省你无数时间,绝对值得学。
项目地址:https://github.com/hashicorp/packer
一样都是 HCL,会 Terraform 看一眼就会写,常用功能半天就能摸清楚。打镜像这种事一次配置好之后一直用,投入一次省你无数时间,绝对值得学。