应用介绍
线上跑 AWS、测试环境在 VMware、本地开发用 VirtualBox,同一个基础环境得手工装三遍,装完还没人说得准三边到底一不一样——bug 出在「我这儿能跑」的时候最难查。Packer 把这件事变成一份配置文件:写一次模板,并行产出各个平台的镜像,装的东西、版本、配置完全一致。
模板用 HCL 写,结构很直白:source 说明从哪个基础镜像起步、往哪个平台产出,provisioner 说明进去之后装什么(可以直接写 shell,也能交给 Ansible、Chef、Puppet),post-processor 说明产出之后怎么打标签、推到哪里去。装软件这一步发生在构建镜像的时候而不是开机的时候,所以实例启动是秒级的,出问题也在构建阶段就暴露了。
一份模板多平台产出:同一个 build 块可以挂多个 source,AWS AMI、Azure、GCP、VMware、VirtualBox、Docker 镜像一次跑完,内容来自同一套 provisioner。
HCL 模板与变量:用 variable 把版本号、区域、实例类型这些抽出来,命令行或变量文件传入,同一份模板跑出 dev 和 prod 两套镜像。
provisioner 接现成工具:shell 脚本、文件上传、Ansible playbook、Chef、Puppet、PowerShell 都能作为构建步骤,不用把配置管理重写一遍。
post-processor 收尾:构建完自动打 Docker tag、生成 Vagrant box、压缩归档或推送到镜像仓库,产物落到该去的地方。
inspect 先看清楚:packer inspect 把模板里的变量、构建目标、provisioner 和 post-processor 列成树,跑之前先确认结构对不对。
fmt 与 validate:fmt 统一格式并能只输出 diff,validate 在真正开机器之前检查语法和引用,省掉云上跑一半才报错的钱。
插件体系:构建器和 provisioner 都是独立插件,required_plugins 里声明版本和来源,Packer 自己拉取安装;1.16 起也支持从非 GitHub 的镜像源装插件。
单个二进制:Go 写的单文件程序,Windows、macOS、Linux 解压即用,扔进 CI 里也不用额外依赖。
模板用 HCL 写,结构很直白:source 说明从哪个基础镜像起步、往哪个平台产出,provisioner 说明进去之后装什么(可以直接写 shell,也能交给 Ansible、Chef、Puppet),post-processor 说明产出之后怎么打标签、推到哪里去。装软件这一步发生在构建镜像的时候而不是开机的时候,所以实例启动是秒级的,出问题也在构建阶段就暴露了。
软件功能
一份模板多平台产出:同一个 build 块可以挂多个 source,AWS AMI、Azure、GCP、VMware、VirtualBox、Docker 镜像一次跑完,内容来自同一套 provisioner。
HCL 模板与变量:用 variable 把版本号、区域、实例类型这些抽出来,命令行或变量文件传入,同一份模板跑出 dev 和 prod 两套镜像。
provisioner 接现成工具:shell 脚本、文件上传、Ansible playbook、Chef、Puppet、PowerShell 都能作为构建步骤,不用把配置管理重写一遍。
post-processor 收尾:构建完自动打 Docker tag、生成 Vagrant box、压缩归档或推送到镜像仓库,产物落到该去的地方。
inspect 先看清楚:packer inspect 把模板里的变量、构建目标、provisioner 和 post-processor 列成树,跑之前先确认结构对不对。
fmt 与 validate:fmt 统一格式并能只输出 diff,validate 在真正开机器之前检查语法和引用,省掉云上跑一半才报错的钱。
插件体系:构建器和 provisioner 都是独立插件,required_plugins 里声明版本和来源,Packer 自己拉取安装;1.16 起也支持从非 GitHub 的镜像源装插件。
单个二进制:Go 写的单文件程序,Windows、macOS、Linux 解压即用,扔进 CI 里也不用额外依赖。

