28- 自动化部署与镜像管理(debootstrap、cloud-init、Packer) 🛠️
前提条件 ✅
- 已完成 Ansible 基础配置(控制节点 + 被管节点连通)
- 以 ops 用户登录(具有 sudo 权限)
- 系统运行在 Debian 12 Bookworm
- 建议准备:一台干净虚拟机(VMware)或云实例,用于测试镜像构建
- 全局约定:主机名 LinuxDC,IP 192.168.1.100(控制节点)
详细步骤 🛠️
- debootstrap – 从零构建 Debian 根文件系统(轻量、离线可用)
安装:
sudo apt install -y debootstrap
创建一个最小 Debian 系统到目录(示例:/opt/chroot-bookworm):
sudo mkdir /opt/chroot-bookworm
sudo debootstrap --arch=amd64 bookworm /opt/chroot-bookworm https://mirrors.tuna.tsinghua.edu.cn/debian/
进入 chroot 环境进一步定制:
sudo chroot /opt/chroot-bookworm /bin/bash
# 在 chroot 内
mount -t proc proc /proc
mount --rbind /sys /sys
mount --rbind /dev /dev
apt update
apt install -y vim locales systemd-sysv openssh-server sudo
dpkg-reconfigure locales # 选择 zh_CN.UTF-8 或 en_US.UTF-8
passwd root
exit
打包成 tarball(可用于容器、LXC、VM 模板):
cd /opt/chroot-bookworm
sudo tar -czf ../debian-bookworm-minimal.tar.gz .
- cloud-init – 云实例初始化(AWS、Azure、GCP、Proxmox、OpenStack 等通用)
安装(在模板机上):
sudo apt install -y cloud-init
基本配置文件示例(/etc/cloud/cloud.cfg):
#cloud-config
hostname: linuxdc-{{ instance_id }}
fqdn: linuxdc-{{ instance_id }}.local
users:
- name: ops
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-ed25519 AAAAC3... # 你的公钥
packages:
- vim
- htop
- git
runcmd:
- [ systemctl, enable, --now, ssh ]
- echo "cloud-init completed at $(date)" >> /var/log/cloud-init-custom.log
测试(本地模拟):
sudo cloud-init clean --logs
sudo cloud-init init
生产中:将 cloud-init 配置写入云平台启动元数据(user-data),或 Packer 构建时注入。
- Packer – 自动化构建镜像(VM、云、容器通用)
安装 Packer(官方方式):
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt update && sudo apt install -y packer
packer --version
创建 Packer 项目目录:
mkdir ~/packer-debian && cd ~/packer-debian
示例 Packer 配置(packer.json 或 packer.hcl):
packer {
required_plugins {
qemu = {
version = ">= 1.0.0"
source = "github.com/hashicorp/qemu"
}
}
}
source "qemu" "debian" {
iso_url = "https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso"
iso_checksum = "sha256:xxxxxxxx" # 从官网校验
ssh_username = "ops"
ssh_password = "StrongPass123!"
ssh_timeout = "20m"
shutdown_command = "echo 'ops' | sudo -S shutdown -P now"
disk_size = "20000"
format = "qcow2"
accelerator = "kvm"
headless = true
vm_name = "debian-12-template"
boot_wait = "5s"
boot_command = [
"<esc><wait>",
"install <wait>",
"preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/preseed.cfg <wait>",
"<enter><wait>"
]
http_directory = "http"
output_directory = "output-debian"
}
build {
sources = ["source.qemu.debian"]
provisioner "shell" {
inline = [
"sudo apt update",
"sudo apt upgrade -y",
"sudo apt install -y qemu-guest-agent cloud-init openssh-server",
"sudo systemctl enable qemu-guest-agent cloud-init"
]
}
provisioner "ansible" {
playbook_file = "../ansible/playbooks/template-hardening.yml"
user = "ops"
extra_arguments = ["--extra-vars", "ansible_become_password=StrongPass123!"]
}
}
创建 http/preseed.cfg(自动化安装应答文件): (内容较长,可参考 Debian 官方 preseed 示例)
构建镜像:
packer init .
packer validate .
packer build .
输出:output-debian/debian-12-template.qcow2 可导入 Proxmox、KVM、OpenStack 等。
实践任务 🎯
- 用 debootstrap 创建一个最小 Debian chroot 环境,进入后安装 ssh 并打包成 tar.gz
- 在一台虚拟机上安装 cloud-init,编写简单 cloud-config,模拟云实例首次启动(手动运行 cloud-init init)
- 安装 Packer,编写一个简单 QEMU 构建模板(不需完整 preseed),构建一个基础 Debian qcow2 镜像
- 将 Ansible playbook 集成到 Packer provisioner 中,实现自动化加固(用户、防火墙、软件包等)
自测问题 ❓
- debootstrap 和 Packer 在构建系统镜像时的主要区别是什么?
- cloud-init 的 user-data 和 meta-data 分别用于什么?
- Packer 的 provisioner 有哪些常见类型?ansible provisioner 的优势是什么?
- 生产环境中为什么推荐将 Packer 构建的镜像作为所有新实例的起点?
总结 📌
debootstrap 适合轻量本地构建,cloud-init 实现云实例个性化初始化,Packer 自动化生产级镜像构建(支持多平台输出)。
本章建立了“镜像即代码”的能力,后续系统迁移、升级、Git 管理都将依赖标准化镜像 + Ansible 配置,形成完整的自动化部署流水线。