Skip to content

集群交付自动化: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]
login01
yaml
# 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 ​

  1. 上架接线 → 2. PXE 装机(DHCP 分配)→ 3. 跑验收脚本(10 分钟,硬件问题当场发现)→ 4. Ansible 全量配置(10 分钟)→ 5. Slurm 注册 + 验收作业(5 分钟)→ 6. 加入生产。

工程启示:

  1. 验收先于配置:硬件问题不暴露就别往下走。
  2. Ansible 幂等 + 版本矩阵:新节点加入 = 改 hosts 重跑,无漂移。
  3. Slurm 验收三连:sinfo 无 drain → GPU 作业跑通 → 共享存储一致。
  4. 基准留档:验收报告 + 首次 benchmark 存 CI,后续性能退化有对照。
  5. 故障节点自动隔离:Slurm HealthCheckProgram 周期探活,异常自动 DRAIN,别等用户报障。
  6. 文档即代码:交付 SOP 写进仓库(playbook + 验收脚本 + 检查清单),新人照做即可。

6. 延伸阅读 ​

AI-HPC 智算超算专家 · Contact: openaihpc@gmail.com