Ubuntu 系统系列 | 第 27 天:Ubuntu 自动部署——PXE 网络安装、Preseed、Cloud-init 自动化

第 27/30 天

引言

当需要批量部署数十台甚至上百台 Ubuntu 服务器时,手动插入 U 盘、逐台点击安装画面显然是不现实的。企业级场景下,自动化部署是刚需——从裸金属服务器的 PXE 网络引导安装,到虚拟机的 Preseed 预配置应答文件,再到云服务器的 Cloud-init 初始化脚本,Ubuntu 提供了全栈式的自动化部署方案。

本文将带你从零搭建一套完整的 Ubuntu 自动化部署体系,涵盖物理机、虚拟机和云实例三种场景,让你一次配置、批量交付。

一、PXE 网络安装:从网络引导到系统就绪

PXE(Preboot eXecution Environment)是一种网络引导标准,允许计算机从网络接口启动操作系统安装程序,完全无需物理介质。

1.1 PXE 工作原理

客户端 → DHCP 请求 IP → TFTP 下载引导程序 → 加载内核/initrd → 访问安装源 → 自动安装

关键组件:
DHCP 服务器:分配 IP 并告知 TFTP 服务器地址
TFTP 服务器:提供引导文件(pxelinux.0、内核、initrd)
HTTP/NFS 服务器:提供 Ubuntu 安装源(镜像文件)
Preseed 文件:自动回答安装过程中的所有问题

1.2 搭建 PXE 服务器

安装必要组件

# 安装 DHCP、TFTP、Nginx 服务
apt update
apt install -y isc-dhcp-server tftpd-hpa nginx pxelinux syslinux-efi

# 创建 PXE 目录结构
mkdir -p /srv/tftp/{pxelinux.cfg,ubuntu}
mkdir -p /srv/ubuntu-install

配置 DHCP 服务器

编辑 /etc/dhcp/dhcpd.conf

cat > /etc/dhcp/dhcpd.conf << 'EOF'
subnet 192.168.100.0 netmask 255.255.255.0 {
    range 192.168.100.100 192.168.100.200;
    option routers 192.168.100.1;
    option domain-name-servers 8.8.8.8, 1.1.1.1;

    # PXE 引导配置
    next-server 192.168.100.10;          # TFTP 服务器 IP
    filename "pxelinux.0";               # BIOS 引导文件
}
EOF

配置 TFTP 引导文件

# 复制 PXE 引导文件
cp /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/
cp /usr/lib/syslinux/modules/bios/{ldlinux.c32,libutil.c32,menu.c32} /srv/tftp/

# 下载 Ubuntu 安装内核
cd /srv/tftp/ubuntu
wget http://archive.ubuntu.com/ubuntu/dists/focal/main/installer-amd64/current/legacy-images/netboot/ubuntu-installer/amd64/{linux,initrd.gz}

配置 Nginx 提供安装源

# 挂载 Ubuntu ISO 或同步镜像
mount -o loop /path/to/ubuntu-24.04-server-amd64.iso /mnt
cp -a /mnt/* /srv/ubuntu-install/
umount /mnt

# Nginx 配置
cat > /etc/nginx/sites-available/ubuntu-install << 'NGINX'
server {
    listen 80;
    server_name 192.168.100.10;
    root /srv/ubuntu-install;
    autoindex on;
}
NGINX

ln -sf /etc/nginx/sites-available/ubuntu-install /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

1.3 PXE 启动菜单

创建 /srv/tftp/pxelinux.cfg/default

cat > /srv/tftp/pxelinux.cfg/default << 'MENU'
DEFAULT menu.c32
PROMPT 0
MENU TITLE Ubuntu Network Install

LABEL Ubuntu 24.04 LTS Auto Install
    KERNEL ubuntu/linux
    APPEND initrd=ubuntu/initrd.gz auto=true priority=critical url=http://192.168.100.10/preseed/ubuntu-auto.seed

LABEL Ubuntu 24.04 LTS Manual
    KERNEL ubuntu/linux
    APPEND initrd=ubuntu/initrd.gz

LABEL Boot from Local Disk
    LOCALBOOT 0
MENU

⚠️ 注意:UEFI 客户端需要不同的引导文件(grubx64.efi),配置文件路径为 grub.cfg。建议同时配置 BIOS 和 UEFI 双模式支持。

二、Preseed:无人值守安装的应答文件

Preseed 是 Ubuntu 安装程序的自动应答机制,本质是一个包含所有安装选项的预配置文件。

2.1 Preseed 文件结构

# 创建 Preseed 目录
mkdir -p /srv/ubuntu-install/preseed/

完整的 Preseed 示例(/srv/ubuntu-install/preseed/ubuntu-auto.seed):

cat > /srv/ubuntu-install/preseed/ubuntu-auto.seed << 'PRESEED'
# 语言和地区设置
d-i debian-installer/locale string en_US.UTF-8
d-i keyboard-configuration/xkb-keymap select us
d-i time/zone string Asia/Shanghai

# 网络配置(DHCP)
d-i netcfg/choose_interface select auto
d-i netcfg/dhcp_timeout string 60

# 镜像源设置
d-i mirror/country string manual
d-i mirror/http/hostname string 192.168.100.10
d-i mirror/http/directory string /ubuntu
d-i mirror/http/proxy string

# 磁盘分区(自动整个磁盘)
d-i partman-auto/method string regular
d-i partman-auto/choose_recipe select atomic
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true

# 用户账户设置
d-i passwd/root-login boolean false
d-i passwd/user-fullname string Ubuntu Admin
d-i passwd/username string ubuntu
d-i passwd/user-password-crypted password $6$salt$encrypted_hash

# 软件包选择
tasksel tasksel/first multiselect ubuntu-server
d-i pkgsel/include string openssh-server vim htop curl wget net-tools

# 引导加载器
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true

# 完成安装后自动重启
d-i finish-install/reboot_in_progress note
PRESEED

2.2 生成加密密码哈希

# 生成可用于 Preseed 的密码哈希
openssl passwd -6 -salt "$(openssl rand -base64 12)" "YourPassword123"
# 输出示例: $6$z0Z0Z0Z0Z0Z0Z0Z0$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

2.3 Preseed 高级用法:本地化配置

# 国内用户使用镜像源加速
cat > /srv/ubuntu-install/preseed/ubuntu-china.seed << 'PRESEED'
d-i debian-installer/locale string zh_CN.UTF-8
d-i keyboard-configuration/xkb-keymap select us
d-i time/zone string Asia/Shanghai
d-i mirror/country string manual
d-i mirror/http/hostname string mirrors.tuna.tsinghua.edu.cn
d-i mirror/http/directory string /ubuntu/
d-i pkgsel/include string openssh-server vim htop curl wget net-tools python3
PRESEED

💡 实操技巧:Preseed 支持 preseed/early_commandpreseed/late_command 在安装前/后执行自定义脚本,非常适合批量添加 SSH 公钥、写入监控 Agent 等操作。

三、Cloud-init:云时代的实例初始化标准

Cloud-init 是 Ubuntu 在云环境中的标配初始化工具,几乎所有的云平台(AWS、Azure、阿里云、OpenStack)都依赖它完成实例的首次启动配置。

3.1 Cloud-init 的工作原理

实例启动 → 读取数据源 → 应用配置 → 执行模块 → 实例就绪

数据源按优先级顺序:
1. NoCloud:本地文件(ISO 或文件系统注入)
2. ConfigDrive:OpenStack 配置盘
3. Metadata Service:云平台 API(AWS/Azure/阿里云)
4. OVF:VMware OVF 属性

3.2 Cloud-init 配置文件格式

Cloud-init 支持 YAML 格式的 #cloud-config 配置:

#cloud-config
hostname: ubuntu-node-01
manage_etc_hosts: true

# 用户和 SSH 密钥
users:
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/ubuntu
    shell: /bin/bash
    lock_passwd: false
    ssh_authorized_keys:
      - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA...

# 写入自定义文件
write_files:
  - path: /etc/motd
    content: |
      Welcome to Ubuntu 24.04 LTS - Auto Deployed
    permissions: '0644'

# 安装软件包
packages:
  - nginx
  - prometheus-node-exporter
  - docker.io

# 执行命令
runcmd:
  - [systemctl, enable, --now, prometheus-node-exporter]
  - [systemctl, enable, --now, docker]
  - echo "Cloud-init completed" > /var/log/cloud-init-done.log

# 最终通知
final_message: "Ubuntu 24.04 LTS deployment complete at $UPTIME"

3.3 本地测试 Cloud-init

# 使用 NoCloud 数据源测试
mkdir -p /tmp/cloud-init-test

# 创建 meta-data
cat > /tmp/cloud-init-test/meta-data << 'EOF'
instance-id: ubuntu-test-01
local-hostname: test-node
EOF

# 创建 user-data(上面写的 #cloud-config 内容)
cp /path/to/cloud-config.yaml /tmp/cloud-init-test/user-data

# 生成 ISO 镜像
cloud-localds /tmp/cloud-init-test/seed.iso /tmp/cloud-init-test/user-data /tmp/cloud-init-test/meta-data

# 在虚拟机中使用
virt-install 
  --name ubuntu-auto 
  --ram 2048 
  --vcpus 2 
  --disk size=20 
  --cdrom /path/to/ubuntu-24.04-live-server-amd64.iso 
  --disk /tmp/cloud-init-test/seed.iso,device=cdrom 
  --os-variant ubuntu24.04

3.4 Cloud-init 常用模块速查

模块 功能 配置示例
users 创建/管理用户 users: - name: deploy
packages 安装软件包 packages: [nginx, htop]
write_files 写入文件 write_files: - path: /etc/config.yaml
runcmd 执行命令 runcmd: - [echo, hello]
apt_sources 配置 APT 源 apt_sources: - source: "deb ..."
mounts 挂载磁盘 mounts: - [/dev/vdb, /data]
ssh_authorized_keys 添加 SSH 公钥 users 模块中配置
timezone 设置时区 timezone: Asia/Shanghai
bootcmd 启动时执行 bootcmd: - [modprobe, bonding]

四、三套方案对比与选型建议

方案 适用场景 学习成本 灵活性 部署速度
PXE + Preseed 裸金属/物理机批量部署 慢(需网络传输)
Cloud-init 云实例/虚拟机初始化 快(秒级)
Packer + Preseed 镜像构建(模板制作) 快(预构建镜像)

选型决策树

需要部署什么?
├── 裸金属物理机 → PXE + Preseed
│   ├── 批量装机(50+台)→ 配置 DHCP + TFTP + HTTP
│   └── 少量自助安装 → 使用 Ubuntu Live Server ISO + USB 引导
├── 虚拟机集群 → Cloud-init + NoCloud
│   ├── OpenStack/KVM → ConfigDrive 数据源
│   └── VMware → OVF 属性注入
├── 云服务器 → Cloud-init 元数据服务
│   ├── AWS EC2 → 自动读取
│   └── 阿里云 ECS → 自动读取
└── 构建镜像模板 → Packer + Preseed
    └── `packer build ubuntu-24.04.json`

五、常见问题与排错

5.1 PXE 客户端无法获取 IP

# 检查 DHCP 服务状态
systemctl status isc-dhcp-server
journalctl -u isc-dhcp-server -n 20 --no-pager

# 检查防火墙
ufw status
# 确保 UDP 67/68(DHCP)、69(TFTP)已放行

5.2 TFTP 文件传输超时

# 测试 TFTP 连接
tftp 192.168.100.10
tftp> get pxelinux.0
tftp> quit

# 检查 TFTP 根目录和权限
ls -la /srv/tftp/
chmod 644 /srv/tftp/pxelinux.0
chown tftp:tftp /srv/tftp -R

5.3 Cloud-init 未执行

# 查看 Cloud-init 日志
less /var/log/cloud-init-output.log
less /var/log/cloud-init.log

# 手动调试
cloud-init init --debug
cloud-init modules --mode=config --debug

# 检查数据源
cloud-init query -all

5.4 Preseed 安装失败

# 安装过程中按 Ctrl+Alt+F2 切换到控制台
# 查看安装日志
less /var/log/syslog
less /var/log/installer/syslog

# 检查 Preseed 语法是否合法
# 常见错误:密码哈希格式错误、磁盘分区方案不匹配

总结

本文从三个维度覆盖了 Ubuntu 自动化部署的全流程:

  1. PXE 网络安装:适合物理机批量部署,虽然搭建门槛较高,但一次配置即可无限复用
  2. Preseed 应答文件:用声明式配置消除安装过程中的交互环节,是自动化装机的基础
  3. Cloud-init 初始化:云原生时代的标准方案,从实例启动到应用就绪只需数秒

对于生产环境,推荐将 PXE + Preseed 用于基础 OS 安装,Cloud-init 用于应用层配置,配合 Packer 构建预定制镜像,形成完整的自动化部署流水线。


下期预告

第 28 天:故障排查实战——系统救援、启动修复、日志分析、崩溃排查

当系统突然崩溃、启动失败或服务异常时,如何快速定位并修复问题?下期将带你深入 Ubuntu 系统救援模式,掌握 GRUB 修复、单用户模式、日志分析、崩溃转储等实战技能,成为真正的系统排障专家。


📖 系列目录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容