4. 批量配置环境准备

批量配置 Supermicro 服务器,本质上不是“把命令发出去”这么简单,而是要让一批裸机在无人值守的情况下,自己找到启动镜像、自己拉取配置、自己校准时间,最后把状态回传给控制节点。这条链路里任何一个环节缺失,都会表现为“机器起来了但装不上”“装上了但时间不对”“时间不对导致证书校验失败”等连锁问题。因此本节先把批量配置的六个基础服务搭好:DHCP、TFTP、HTTP、DNS、NTP,以及承载自动化逻辑的控制节点。

一、六个角色各自解决什么问题

先明确分工,避免把功能混在一台机器上导致排障困难。DHCP 负责给待装服务器分配 IP,并通过 option 66/67 告诉它“去哪个 TFTP 取引导文件”;TFTP 负责传输 PXE 引导程序(如 undionly.kpxe、ipxe.efi)和初始配置;HTTP 负责传输体积更大的安装镜像、kickstart/preseed 文件、Supermicro 的 SUM 工具包和固件;DNS 负责把主机名解析成 IP,让自动化脚本用名字而不是硬编码地址;NTP 负责统一时间,保证日志、证书和带外管理事件的时间线一致;控制节点则是 Ansible/Redfish 脚本、IPMI 工具和配置仓库的运行位置。

批量配置基础服务链路 待装服务器 PXE 网卡启动 BMC / IPMI 裸机 · 无系统 DHCP 分配 IP / 网关 option 66 / 67 TFTP 引导程序 ipxe.efi / kpxe HTTP 镜像 / kickstart SUM / 固件包 DNS 正向 / 反向解析 主机名 → IP NTP 统一时间源 日志 / 证书一致 控制节点 Ansible / Redfish 配置仓库 / 日志 ① 广播发现 ② 指向引导 ③ 拉取镜像 解析主机名 校时 ④ 下发配置 / 采集状态 读取镜像 ① DHCP 定位 → ② TFTP 引导 → ③ HTTP 取镜像 → ④ 控制节点下发与回收;DNS/NTP 全程提供解析与时间基准

二、网络与地址规划

建议为批量配置单独划一个管理网段,例如 10.10.0.0/24,网关 10.10.0.1,DHCP 地址池 10.10.0.100–10.10.0.200。控制节点固定为 10.10.0.10,DNS 与 NTP 可以复用控制节点,也可以单独部署。关键原则是:DHCP 只在这个网段内响应,避免误给办公网设备发地址;PXE 服务器与控制节点在同一二层网络,减少跨网段转发带来的 option 丢失问题。

如果待装机器数量较多,建议在 DHCP 中按 MAC 地址做静态绑定,把每台机器的 IP 与主机名提前登记。这样后续 Ansible 的 inventory 可以直接用主机名,日志里也能一眼看出是哪台机器出了问题。示例配置片段如下:

# /etc/dhcp/dhcpd.conf 片段
subnet 10.10.0.0 netmask 255.255.255.0 {
  range 10.10.0.100 10.10.0.200;
  option routers 10.10.0.1;
  option domain-name-servers 10.10.0.10;
  next-server 10.10.0.10;          # TFTP 地址
  filename "ipxe.efi";             # 引导文件名
}

host node-01 {
  hardware ethernet 3C:EC:EF:11:22:01;
  fixed-address 10.10.0.101;
  option host-name "node-01";
}

三、TFTP 与 HTTP 的目录组织

TFTP 根目录建议放在 /var/lib/tftpboot,只放引导阶段必需的小文件:ipxe.efi、undionly.kpxe、snponly.efi 以及一个 boot.ipxe 脚本。HTTP 根目录放在 /var/www/html,按用途分目录:/images/ 放 ISO 与解压后的安装树,/ks/ 放 kickstart 文件,/sum/ 放 Supermicro Update Manager,/firmware/ 放 BIOS/BMC 固件。这样做的目的是让引导阶段走轻量 TFTP,安装阶段走高吞吐 HTTP,避免用 TFTP 传几百 MB 的镜像导致超时。

一个可用的 boot.ipxe 示例:

#!ipxe
dhcp
set base http://10.10.0.10
kernel ${base}/images/vmlinuz ip=dhcp inst.ks=${base}/ks/node.cfg
initrd ${base}/images/initrd.img
boot

四、DNS 与 NTP 的最小可用配置

DNS 用 dnsmasq 或 BIND 都可以。若用 dnsmasq,只需在 /etc/dnsmasq.conf 中加两行:interface=eth1 限定监听网卡,addn-hosts=/etc/hosts.nodes 加载主机名映射。NTP 用 chrony,控制节点作为内网时间源,配置文件里写 allow 10.10.0.0/24,待装机器在 kickstart 的 %post 段执行 chronyc sources 验证同步状态。时间不同步最典型的后果是 Redfish 证书校验失败和日志时间错乱,排障时很难定位,所以这一步不能省。

五、控制节点搭建与验证

控制节点上安装 Ansible、ipmitool、redfish 相关 Python 库,并建立配置仓库目录:inventory/、group_vars/、playbooks/、files/。验证顺序建议从底层往上:先 ping 10.10.0.10 确认网络,再 tftp 10.10.0.10 -c get ipxe.efi 确认引导文件可取,然后 curl -I http://10.10.0.10/images/vmlinuz 确认 HTTP 可访问,最后 ansible all -m ping 确认控制节点能连到已装好的机器。每一步都通过后再批量开机,能大幅减少“全部失败却不知道卡在哪”的情况。

建议把六个服务的启动状态、监听端口和关键文件路径整理成一张检查表,每次扩容或迁移前逐项确认,比事后翻日志高效得多。