跳转至

SOP — LSF submit 节点接入(192.168.31.28 / hpc-submit)

变更日期:2026-09-25;执行窗口:23:07 ~ 23:57;变更类型:C 类(生产变更) 实现体:deploy/lsf/stages/submit_node.py(阶段 14)+ 配置 deploy/lsf/config/lsf_deploy.yaml 本文档为本次变更档案;日常使用与速查见 ../docs/RUNBOOK.md

一、背景

新增一台专用于 HPC 作业提交的主机 192.168.31.28(主机名 hpc-submit,Rocky 9.8,8C/15G, 已属 Slurm 集群的提交端,已挂载 /data/nfs/{home,projects,tools,pdk,modulefiles} 与 LDAP 认证), 要求把它作为 LSF 集群的 submit 节点接入:可提交/查询作业,但不接收作业执行。 原部署器只覆盖 masters/workers 两类角色,缺少 submit 角色与接入能力,故需扩展实现体。

二、目标

变更完成后应达到的可验证状态:

# 目标 判据
1 hpc-submit 登记为集群成员 lsf.cluster.lsfce Host 段含该主机(server 列 1)
2 不接收作业执行 lsb.hosts 中该主机 MXJ=0;bhosts -w 显示 closed_Full 且 MAX=0
3 本机 LSF 就绪 lim/res/sbatchd 运行;/etc/profile.d/lsf.sh、/etc/lsf.sudoers(600) 就位
4 提交链路可用 从 hpc-submit bsub 提交 → 终态 DONE,执行主机落在 lsf-work-0x
5 幂等 阶段 14 复跑「零变更跳过」;--drift 全阶段无漂移

三、前置条件

  1. 操作机可 root 免密登录 192.168.31.28(已具备)。
  2. 集群运行正常、无 RUN 作业(执行前已确认 bjobs -u all = No unfinished job)。
  3. hpc-submit 已挂载 NFS 共享(/home 等已就绪;/data/nfs/lsf 由阶段 1 补挂)。
  4. 凭据文件 deploy/lsf/config/credentials.yaml(600)可用。
  5. 执行前只读预检无 BLOCK:--precheck(本次仅 WARN:submit 相关 hosts 缺失按设计降级)。

四、影响范围

项 内容
目标主机 192.168.31.28(新增接入)
既有集群 5 台(.23~.27):仅共享配置新增一行 + 6 台 /etc/hosts 追加一行;不改其 LSF 服务
是否停服 不停服。生效动作含 lsadmin reconfig(仅重启 master candidate LIM)与 badmin mbdrestart(重启 mbatchd),执行时集群无作业
窗口与在跑作业 执行窗口内确认无 RUN 作业;hpc-submit 不接收作业,无需 drain
不可逆环节 无。共享配置与节点文件均可由备份还原

五、分步操作

以实现体为准;下列序列与 deploy/lsf/stages/submit_node.py 等价,供阅读与复核。

cd /home/rain/Documents/LSF/lsf_ins/deploy/lsf

# 门禁:只读预检(配置校验 + 环境检查,落盘 reports/precheck_<ts>.txt)
.venv/bin/python main.py -c config/lsf_deploy.yaml --precheck

# 预演:零副作用输出变更清单
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit --dry-run

# 阶段0:依赖与互信(6 台,补齐 hpc-submit;含 /root/.ssh 双向互信)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage prepare

# 阶段1:NFS(仅 hpc-submit 新增 /data/nfs/lsf 挂载与 fstab)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage nfs

# 阶段2:LDAP 认证(仅 hpc-submit 补 openldap-clients)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage node-env

# 阶段14:submit 节点接入(本阶段为本次核心)
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit

阶段 14 内部动作(幂等,均有前置状态探测):

# 1) /etc/hosts 双向补齐(执行节点 ↔ submit 节点),同目录备份 /etc/hosts.bak.<ts>
# 2) 共享配置登记(先 cp -a 备份到 <file>.bak.<ts>):
#    lsf.cluster.<cluster>  : <name>  !  !  1  ()      # server=1,集群成员
#    lsb.hosts              : <name>  0  () () () () () (Y)   # MXJ=0,不接作业
# 3) 生效(交互命令需按提示应答;reconfig 只答第一问=仅重启 master LIM)
su - ldapadmin -s /bin/bash -c "bash -lc \"printf 'y\n' | lsadmin reconfig\""
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | badmin mbdrestart'"
# 4) submit 节点本机就绪
/data/nfs/lsf/lsf/10.1/install/hostsetup --top=/data/nfs/lsf/lsf --boot=y   # 高危:写本机 systemd 单元
#    /etc/profile.d/lsf.sh(内容与其它节点一致)
#    /etc/lsf.sudoers(沿用集群 LSF_EAUTH_KEY,权限必须 600)              # 高危
su - root -c "bash -lc 'lsf_daemons start'"                                  # lim/res/sbatchd
# 5) 等待集群识别(轮询 lsload <name> 直到取到数据,不用固定 sleep)
# 6) 提交冒烟:从 hpc-submit bsub → 终态 DONE 且 exec_host 属执行节点

六、验证

# 1) 集群视图:hpc-submit 应为 closed_Full / MAX=0,其余 5 台 ok
ssh root@192.168.31.23 "source /data/nfs/lsf/lsf/conf/profile.lsf; bhosts -w"
#  实测:hpc-submit closed_Full - 0 0 0 0 0 0 / 5 台 ok

# 2) 从 submit 节点提交作业并查执行位
ssh root@192.168.31.28 "bash -lc 'bsub -o /tmp/.x.out sleep 8'"
ssh root@192.168.31.23 "bash -lc 'bjobs -a -o \"jobid stat exec_host\" | tail -3'"
#  实测:作业 739 DONE,EXEC_HOST=lsf-work-03;LDAP 用户 rain01 提交成功

# 3) 提交节点本机就绪
ssh root@192.168.31.28 "bash -lc 'for d in lim res sbatchd; do pgrep -x \$d >/dev/null && echo \$d=ok; done; ls -l /etc/lsf.sudoers'"
#  实测:三个守护均 ok;/etc/lsf.sudoers 权限 600

# 4) 冒烟标记(共享盘)
ls -l /data/nfs/lsf/lsf/.submit_ok.hpc-submit

# 5) 幂等:阶段 0/1/2/14 复跑应「零变更跳过」
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage submit     # 实测 ⏭ 零变更跳过
.venv/bin/python main.py -c config/lsf_deploy.yaml --stage prepare    # 实测 ⏭ 零变更跳过

# 6) 全阶段只读漂移检测(退出码 0 = 无漂移)
.venv/bin/python main.py -c config/lsf_deploy.yaml --drift; echo rc=$?
#  实测:阶段 0/1/2/3-6/7-8/10/11/12/14 全部「无漂移」,rc=0

七、回滚

按「共享配置 → 节点文件 → 本机守护」顺序逆操作;备份清单与存放位置见 backup/README.md(含共享目录同目录备份与节点同目录备份两节)。

# 1) 共享配置还原(在任一可写 NFS 的节点以 root 执行)
cd /data/nfs/lsf/lsf/conf
cp -a lsf.cluster.lsfce.bak.20260925-232524 lsf.cluster.lsfce          # 还原主机清单
cp -a lsbatch/lsfce/configdir/lsb.hosts.bak.20260925-232524 lsbatch/lsfce/configdir/lsb.hosts
# 2) 生效(同第五节第 3 步的应答方式)
su - ldapadmin -s /bin/bash -c "bash -lc \"printf 'y\n' | lsadmin reconfig\""
su - ldapadmin -s /bin/bash -c "bash -lc 'yes | badmin mbdrestart'"
# 3) 节点侧还原(6 台):/etc/hosts;.28 另停守护并清理接入产物
ssh root@192.168.31.28 "cp -a /etc/hosts.bak.20260925-230743 /etc/hosts"
ssh root@192.168.31.28 "bash -lc 'lsf_daemons stop'; rm -f /etc/profile.d/lsf.sh /etc/lsf.sudoers /data/nfs/lsf/lsf/.submit_ok.hpc-submit"
# 4) 回滚后验证:bhosts 仅 5 台;lsf.cluster/lsb.hosts 不含 hpc-submit;drift 仍应为 0

工程代码的逆操作见 backup/README.md 第 1 节(逐文件列出)。

八、风险说明

风险 说明与缓解
改共享集群配置 先 cp -a 备份(.bak.<ts>),并逐次核对 badmin mbdrestart 的配置检查输出(No fatal errors)
badmin mbdrestart 重启 mbatchd 影响调度数秒;执行前确认无 RUN 作业;不可在集群繁忙窗口执行
交互命令空转 lsadmin reconfig/badmin mbdrestart 均会提问,须按提示应答;空应答会导致「未执行但返回正常」的假象(本次踩过)
eauth 静默失效 /etc/lsf.sudoers 权限非 600 时 LSF 不使用该 key,表现为 User permission denied(本次踩过,已固化为探测项)
新增节点误接作业 由 lsb.hosts MXJ=0 静态限制;冒烟判据额外校验 exec_host 不得为 submit 主机
既有阶段误把 submit 计入期望值 已把 cluster_up/failover/cgroup_v1/lsf_install 的期望集合改为执行节点(exec_nodes())

附录 A:本次修复的既有缺陷(非本次引入,但由本次暴露)

# 缺陷 影响 修复
1 _local_keyscan 未过滤 ssh-keyscan 注释行(3 字段,被当 key 行) 阶段 0 的 mesh_ssh 恒判 pending,互信永远补不齐 过滤 # 行;显式 -t rsa,ecdsa,ed25519;空结果重试一次
2 known_hosts 判据用 key 前缀(40/60 字符)比对 ecdsa 公钥 base64 前缀雷同 → 互相误判「已存在」,缺失 key 永不写入 统一改为完整 key(keytype + key)比对

附录 B:交付物清单

文件 说明
deploy/lsf/stages/submit_node.py 阶段 14 实现体(含踩坑注释)
deploy/lsf/config/lsf_deploy.yaml 新增 nodes.submit 角色配置
submit_node/SOP.md 本文件
submit_node/backup/README.md 备份台账(工程改动 + 集群侧备份)
docs/HANDOFF.md 交接快照(本次已更新)

来源:/home/rain/Documents/LSF/lsf_ins/submit_node/SOP.md | 最后更新:2026-09-26 00:13(由 build/sync.py 同步,请勿在站点侧修改)