← 中文资源

简体中文版本

用 Packer 构建不可变镜像

用 Packer 模板烘焙加固后的基础镜像、在 CI 中校验并构建,并对镜像做版本管理,使实例启动结果一致。

阅读英文原文

概述

靠手工或冗长的启动脚本配置服务器,难以复现相同实例且会累积漂移。Packer 把镜像内容完全代码化,配合 CI 中的校验、构建与启动冒烟测试,产出可版本化、可复现的镜像。

关键步骤

  1. 编写含源镜像与加固及安装步骤的模板。
  2. 在每次变更时于 CI 校验并构建。
  3. 启动镜像并对关键服务做冒烟测试。
  4. 版本化并发布镜像,由 IaC 引用具体版本。

验证

  • 镜像内容完全由代码指定。
  • 构建可复现且源镜像已固定。
  • 启动后关键服务正常。
  • 镜像中不含任何密钥。

注意事项

  • 烘焙镜像以构建时间换启动速度,需要流水线让镜像持续跟上补丁。
  • 不可变镜像仍需补丁节奏;不重建则会随时间积累漏洞。

适用范围

本条目围绕「用 Packer 构建不可变镜像」给出可复制的步骤、验证方式与常见问题,适合需要按此流程落地的工程团队。执行时请结合自身上下文调整命令与阈值,并在变更前后留存证据,便于后续复核与回滚。

source "amazon-ebs" "base" {
  ami_name = "app-base-{{timestamp}}"
  source_ami = var.base_ami
  instance_type = "t3.micro"
}
build {
  sources = ["source.amazon-ebs.base"]
  provisioner "ansible" { playbook_file = "hardening.yml" }
}