第 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_command和preseed/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 自动化部署的全流程:
- PXE 网络安装:适合物理机批量部署,虽然搭建门槛较高,但一次配置即可无限复用
- Preseed 应答文件:用声明式配置消除安装过程中的交互环节,是自动化装机的基础
- Cloud-init 初始化:云原生时代的标准方案,从实例启动到应用就绪只需数秒
对于生产环境,推荐将 PXE + Preseed 用于基础 OS 安装,Cloud-init 用于应用层配置,配合 Packer 构建预定制镜像,形成完整的自动化部署流水线。
下期预告
第 28 天:故障排查实战——系统救援、启动修复、日志分析、崩溃排查
当系统突然崩溃、启动失败或服务异常时,如何快速定位并修复问题?下期将带你深入 Ubuntu 系统救援模式,掌握 GRUB 修复、单用户模式、日志分析、崩溃转储等实战技能,成为真正的系统排障专家。
📖 系列目录
- 第 1 天:Ubuntu 简介与版本选择
- 第 2 天:手把手安装 Ubuntu
- 第 3 天:Ubuntu 桌面环境初探
- 第 4 天:Ubuntu 终端基础
- 第 5 天:用户与权限管理
- 第 6 天:软件包管理
- 第 7 天:文件与文本操作
- 第 8 天:系统服务管理
- 第 9 天:磁盘与文件系统管理
- 第 10 天:网络配置与管理
- 第 11 天:进程管理与监控
- 第 12 天:计划任务与自动化
- 第 13 天:备份与恢复策略
- 第 14 天:系统更新与升级管理
- 第 15 天:SSH 远程管理与安全加固
- 第 16 天:Web 服务器搭建
- 第 17 天:数据库服务器部署
- 第 18 天:Docker 在 Ubuntu 上的安装与容器化管理
- 第 19 天:文件共享服务
- 第 20 天:监控与告警系统
- 第 21 天:邮件服务器基础
- 第 22 天:系统安全加固
- 第 23 天:性能调优与内核参数
- 第 24 天:虚拟化技术
- 第 25 天:容器编排入门
- 第 26 天:高可用与负载均衡
- 第 27 天:Ubuntu 自动部署——PXE 网络安装、Preseed、Cloud-init 自动化 ← 本篇
- 第 28 天:故障排查实战 🔜
- 第 29 天:Ubuntu 社区与文档 🔜
- 第 30 天:30 天回顾 🔜















暂无评论内容