集群交付自动化:PXE 装机 + Ansible 批量配置到 Slurm 就绪
摘要: PXE 装完系统只是"有了操作系统",离"可用集群"还差十万八千里:网卡 IP、主机名、共享存储、驱动、Slurm——100 台节点一台台配要配到崩溃。本文把交付流程标准化:PXE 装机 → 节点验收 → Ansible 批量配置 → Slurm 就绪检查,全部给可复现的流程与检查清单。
0. 实验目标
- 补齐 PXE 装机(PXE 无盘部署篇)之后的关键环节:从"装好系统"到"集群可用"
- 用 Ansible 批量完成:主机名/网络、共享存储挂载、GPU 驱动与固件、Slurm 配置分发
- 建立节点验收清单:硬件健康、拓扑、驱动、性能基线
- 交付一套"新节点 30 分钟就绪"的标准作业程序(SOP)
1. 交付流程总览
text
裸机 → PXE 装机(OS 就绪)
→ 节点验收(硬件/网络/驱动健康)
→ Ansible 批量配置(主机名、存储、驱动、Slurm、监控)
→ Slurm 就绪检查(slurmctld/slurmd 健康、节点注册、作业验收)
→ 加入生产集群2. 第一步:节点验收脚本(装机后立即跑)
bash
# 装机后每台节点跑一遍,输出验收报告
cat > /root/node_acceptance.sh <<'EOF'
#!/bin/bash
echo "== CPU =="; lscpu | grep -E "Model name|^CPU\(s\)"
echo "== 内存 =="; free -g | head -2
echo "== GPU =="; nvidia-smi -L 2>/dev/null || echo "NO GPU DRIVER"
echo "== GPU 拓扑 =="; nvidia-smi topo -m 2>/dev/null | head -9
echo "== PCIe 链路 =="; for b in $(nvidia-smi --query-gpu=pci.bus_id --format=csv,noheader); do
lspci -vvv -s $b | grep -i LnkSta | head -1; done
echo "== IB 网卡 =="; ibstat 2>/dev/null | grep -E "State|Rate|Port" || echo "NO IB"
echo "== 磁盘 =="; lsblk -d -o NAME,SIZE,MODEL | head -8
EOF
bash /root/node_acceptance.sh | tee /var/log/node-acceptance-$(hostname).log逐段拆解:
- 装机后第一件事是验收,不是配置——硬件坏了先暴露,别带着坏节点配半天。
- 五项必查:CPU/内存、GPU 驱动与数量、GPU 拓扑(NVLink 是否全互联)、PCIe 链路(x16 还是 x8)、IB 网卡状态。每一项都直接决定后续性能(详见 GPU 服务器拓扑 篇)。
- 验收报告留档(
/var/log/),与后续性能基线对比用。
3. 第二步:Ansible 批量配置
yaml
# ansible/hosts.ini —— 按角色分组
[login]
login01 ansible_host=10.0.0.11
[compute]
node01 ansible_host=10.0.0.21
node02 ansible_host=10.0.0.22
[slurm_controller]
login01yaml
# ansible/playbooks/cluster-baseline.yml
- name: 集群基础配置
hosts: all
become: true
tasks:
- name: 主机名与 hosts
copy:
content: |
10.0.0.11 login01
10.0.0.21 node01
10.0.0.22 node02
dest: /etc/hosts
- name: 挂载共享存储(/share 为共享数据盘)
mount:
path: /share
src: 10.0.0.10:/share
fstype: nfs
opts: defaults,hard,intr
state: mounted
- name: GPU 驱动与固件
hosts: compute
become: true
tasks:
- name: 安装 NVIDIA 驱动(版本矩阵统一管理)
apt:
name: "nvidia-driver-{{ nvidia_driver_version }}"
state: present
- name: 检查 IB 固件版本
shell: ibstat | grep Firmware || true
- name: Slurm 配置分发
hosts: compute
become: true
tasks:
- name: 下发 slurmd.conf
copy:
src: "files/slurm/slurm.conf"
dest: /etc/slurm/slurm.conf
mode: "0644"
- name: 启动 slurmd
systemd:
name: slurmd
state: started
enabled: true工程启示:
- 版本矩阵统一管理:驱动版本、固件版本、Slurm 版本用变量(
group_vars)统一定义,避免"这台 535、那台 545"的漂移。 - Ansible 幂等:同一 playbook 反复跑结果一致,新节点加入只改 hosts 清单重跑即可。
- 配置模板化:slurm.conf 用 Jinja2 模板按角色生成(controller/compute 不同段),避免手抄出错。
4. 第三步:Slurm 就绪检查
bash
# 控制器侧:确认所有节点注册且健康
sinfo -N -o "%N %t %C %G"
# 节点健康:DRAIN 数量应为 0
sinfo -t drained
# 验收作业:在每台计算节点跑一个 GPU 小作业,确认能跑通
srun --nodelist=node01 -N1 --gres=gpu:1 \
nvidia-smi -L && echo "node01 GPU OK"
srun --nodelist=node02 -N1 --gres=gpu:1 \
nvidia-smi -L && echo "node02 GPU OK"
# 批量验收:对所有节点跑同一作业(-b 分批避免风暴)
sbatch --wrap "nvidia-smi -L > /tmp/gpu_check_$SLURM_JOB_ID.log"就绪检查清单:
| 检查项 | 命令 | 通过标准 |
|---|---|---|
| 节点注册 | sinfo -N | 全部 idle,无 drain |
| GPU 可见 | srun --gres=gpu:1 nvidia-smi -L | 每节点 GPU 数与配置一致 |
| 共享存储 | srun df -h /share | 所有节点看到同一挂载 |
| 作业调度 | sbatch sleep 60 | 正常排队运行 |
| 网络带宽 | srun mpirun -np 2 pingpong | 跨节点 IB 带宽达标 |
5. 新节点 30 分钟就绪 SOP
- 上架接线 → 2. PXE 装机(DHCP 分配)→ 3. 跑验收脚本(10 分钟,硬件问题当场发现)→ 4. Ansible 全量配置(10 分钟)→ 5. Slurm 注册 + 验收作业(5 分钟)→ 6. 加入生产。
工程启示:
- 验收先于配置:硬件问题不暴露就别往下走。
- Ansible 幂等 + 版本矩阵:新节点加入 = 改 hosts 重跑,无漂移。
- Slurm 验收三连:sinfo 无 drain → GPU 作业跑通 → 共享存储一致。
- 基准留档:验收报告 + 首次 benchmark 存 CI,后续性能退化有对照。
- 故障节点自动隔离:Slurm
HealthCheckProgram周期探活,异常自动 DRAIN,别等用户报障。 - 文档即代码:交付 SOP 写进仓库(playbook + 验收脚本 + 检查清单),新人照做即可。
6. 延伸阅读
- Ansible 官方文档
- Slurm 快速入门
- 本知识库:05. 集群装机 章节 · PXE 无盘部署 · Ubuntu 自动安装 · GPU 硬件拓扑