跳转至

28- 自动化部署与镜像管理(debootstrap、cloud-init、Packer) 🛠️

前提条件 ✅

  • 已完成 Ansible 基础配置(控制节点 + 被管节点连通)
  • 以 ops 用户登录(具有 sudo 权限)
  • 系统运行在 Debian 12 Bookworm
  • 建议准备:一台干净虚拟机(VMware)或云实例,用于测试镜像构建
  • 全局约定:主机名 LinuxDC,IP 192.168.1.100(控制节点)

详细步骤 🛠️

  1. 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 .

  1. 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 构建时注入。

  1. 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 等。

实践任务 🎯

  1. 用 debootstrap 创建一个最小 Debian chroot 环境,进入后安装 ssh 并打包成 tar.gz
  2. 在一台虚拟机上安装 cloud-init,编写简单 cloud-config,模拟云实例首次启动(手动运行 cloud-init init)
  3. 安装 Packer,编写一个简单 QEMU 构建模板(不需完整 preseed),构建一个基础 Debian qcow2 镜像
  4. 将 Ansible playbook 集成到 Packer provisioner 中,实现自动化加固(用户、防火墙、软件包等)

自测问题 ❓

  1. debootstrap 和 Packer 在构建系统镜像时的主要区别是什么?
  2. cloud-init 的 user-data 和 meta-data 分别用于什么?
  3. Packer 的 provisioner 有哪些常见类型?ansible provisioner 的优势是什么?
  4. 生产环境中为什么推荐将 Packer 构建的镜像作为所有新实例的起点?

总结 📌

debootstrap 适合轻量本地构建,cloud-init 实现云实例个性化初始化,Packer 自动化生产级镜像构建(支持多平台输出)。
本章建立了“镜像即代码”的能力,后续系统迁移、升级、Git 管理都将依赖标准化镜像 + Ansible 配置,形成完整的自动化部署流水线。