KVM 创建 5 台 Rocky 9(LSF 批次)+ 部署工具通用可重复性改造 — 变更 SOP¶
工程位置:
kvm_rocky9_deploy/本次配置:config/hosts-20260924-lsf.yaml实现体:deployer.py、main.py、config_schema.py、templates/ks.cfg.tmpl本文件为 C 类生产变更交付物;第 5 章为文档呈现,一切以实现体为准。
1. 背景¶
两件互相关联的事,一并交付:
- 需求一:部署工具通用可重复性改造。 该工程此前已做到「配置驱动」(主机名、IP、
MAC、规格、磁盘、登录方式全部由 YAML 给出),但对齐运维工具规范仍有缺口——
没有独立只读的预检查与漂移检测入口;状态探测把「探测失败」和「需要变更」压成同一个
布尔值(探测不可用时会被当成需要变更,进而误改系统);配置校验与业务实现体耦合;
没有计划文件可留档复核;
--dry-run --rollback组合会真实销毁资源。 - 需求二:按 slurm 批次规格再建 5 台 Rocky 9 主机用于 LSF,名称
lsf-master-01/02与lsf-work-01~03,IP192.168.31.23–27(使用方已确认与网络中既有地址不冲突)。
两项合并交付的理由:第二件正是第一件的验收场景——改造后的工具必须能零改代码支撑新批次, 并且对既有 k8s / slurm / lustre 三个批次保持行为一致。
改造范围(经确认取「补齐关键缺口」档,未引入环境契约文件、bundle 自包含交付、 离线仓库与批次失败阈值,二者列入附录的遗留事项):
| 改造项 | 改造前 | 改造后 |
|---|---|---|
| 状态探测 | pool_exists/vol_exists/domain_exists 等返回布尔,探测失败被折成「不存在」 |
统一三态 ProbeState(DONE/PENDING/UNKNOWN);UNKNOWN 一律中止并报错 |
| 门禁 | pre_check 逐项 return False 早退,配置校验混在实现体里 |
环境预检查 + config_schema.py 配置校验合并,逐项汇总不早退,通过/告警/阻断分列 |
| 只读入口 | 无 | --precheck(门禁体检)、--drift(漂移检测),各自落盘报告 |
| 计划 | 无 | 巡检产出 build/plans/plan-<配置名>-<时间戳>.yaml(动作/目标/期望) |
| 高危确认 | --rollback 直接执行;--dry-run --rollback 也会真删 |
--rollback 需 --force 或交互确认;预演下只列清单 |
--force 边界 |
不存在 | 仅放行可恢复场景与确认高危回滚;校验项无开关 |
| 死代码/幽灵配置 | _ensure_file 无调用点;network.prefix 配置后无效果 |
已删除 |
2. 目标¶
2.1 工具侧(可验证)
| 目标项 | 期望 |
|---|---|
| 只读体检 | --precheck 不取进程锁、零系统改动,输出逐项结果并落盘报告;有阻断时退出码 2 |
| 漂移检测 | --drift 只报告差异;无漂移 0、有漂移 4、探测失败 5 |
| 三态语义 | 任何探测不可用(libvirtd 异常、输出无法解析)→ 中止变更,不产生任何副作用 |
| 预演承诺 | --dry-run 前后系统状态(域列表、池内卷、镜像目录)指纹一致 |
| 计划留档 | 每次巡检产出计划文件;与上一份不一致时提示按当前状态重新生成 |
| 既有批次不回归 | 对已完成的 slurm 批次跑 --drift 得 0;真实执行得 skipped |
2.2 LSF 批次(可验证)
| 目标项 | 期望值 |
|---|---|
| 主机数量与名称 | 5 台:lsf-master-01、lsf-master-02、lsf-work-01、lsf-work-02、lsf-work-03 |
| 操作系统 | Rocky Linux 9.x |
| 规格 | master-01 4 vCPU / 4 GiB;master-02 2 vCPU / 2 GiB;work-01~03 各 8 vCPU / 16 GiB |
| 系统盘 | master 各 20 GiB、work 各 100 GiB(qcow2,落在 hdd-pool,稀疏分配) |
| 数据盘 | 无 |
| 网络 | 桥接 br0,静态 IP 192.168.31.23–27,网关与 DNS 均为 192.168.31.2 |
| MAC | 52:54:00:31:0d:01–0d:05(0a 段 k8s、0b 段 slurm、0c 段 lustre 已占用) |
| 登录 | 仅公钥登录(PasswordAuthentication no),注入宿主 rain 的 id_ed25519.pub |
| swap | 关闭 |
| 开机自启 | 5 台均 autostart=yes |
| 内存气球策略 | 5 台均启用 deflate-on-oom |
| 既有环境 | 宿主内核参数与 KSM 服务零改动;既有 13 台域(k8s 6、slurm 5、lustre 2、openwrt 1)零改动 |
| 幂等 | 连续第二次执行零变更、全跳过 |
3. 前置条件¶
权限与身份
- 以 root 执行(写
build/、config/credentials-lsf.yaml,并调用virsh qemu:///system); 宿主rain用户已配置免密 sudo。
依赖组件(本次已逐项核查)
| 组件 | 要求 | 校验命令 | 本次结果 |
|---|---|---|---|
| libvirt / QEMU | libvirt 10.0、QEMU 8.2 | virsh version |
满足 |
| virt-install | 4.1.0(--osinfo 必填) |
virt-install --version |
满足 |
| libosinfo | 含 rocky9 条目 |
osinfo-query os \| grep rocky9 |
满足 |
| ISO | /data/kvm/iso/Rocky-9-latest-x86_64-dvd.iso |
ls -l /data/kvm/iso/ |
存在 |
| 存储池 | hdd-pool 处于 running |
virsh pool-list |
running |
| SSH 公钥 | /home/rain/.ssh/id_ed25519.pub |
ls -l |
存在 |
以上检查已全部落为可执行项:main.py --precheck 会逐项探测(deployer._env_outcomes()),
不通过即退出码 2,不会进入任何变更步骤。
执行前检查项
| 检查项 | 结论 |
|---|---|
目标 IP .23–.27 是否占用 |
逐台 ping 确认空闲(.21/.22 已被 lustre 占用) |
MAC 52:54:00:31:0d:* 是否冲突 |
比对全部既有域,0d 段空闲 |
路由器 DHCP 池是否覆盖 .23–27 |
使用方已确认该段不会冲突 |
| 宿主内存余量 | total 117 GiB、available 52 GiB;本批次名义 54 GiB,靠 deflate-on-oom 兜底 |
| 宿主在跑作业 | 宿主无调度类作业;既有主机保持运行,本次不触碰 |
4. 影响范围¶
变更主机:KVM 宿主 dell-R620(唯一主机,全部操作在本机执行)。
工程侧改动
| 文件 | 动作 |
|---|---|
deployer.py |
改写:三态探测接入、门禁重构(环境+配置合并)、独立只读入口、计划文件、回滚预演保护、死代码删除、SSH 端口与探测超时下沉配置 |
main.py |
改写:新增 --precheck / --drift / --force;--rollback 需显式确认;退出码语义明确 |
config_schema.py |
新增:配置合法性校验(必填/类型/取值域/命名/跨字段唯一性/未实现字段),输出含字段路径与级别 |
utils/kvm_utils.py |
改写:折平布尔探测 → 三态 ProbeState 族;新增池/域/卷枚举、systemd 与 TCP 三态探测 |
config/deploy.yaml、config/deploy.yaml.example |
删除零引用的 network.prefix;样例补 runtime.ssh_port、runtime.probe_timeout_sec |
config/hosts-20260924-lsf.yaml |
新增:LSF 批次配置(5 台) |
宿主侧改动:无。配置未包含 host_tuning,实现体不读写
/etc/sysctl.d/99-kvm-host.conf 与 /etc/systemd/system/ksm.service。
虚机侧新增
| 对象 | 动作 |
|---|---|
磁盘卷 hdd-pool/lsf-*.qcow2 |
新增 5 个(20G×2、100G×3,qcow2 稀疏) |
| 域定义 | 新增 5 个,并设置开机自启 |
| 主机内配置(kickstart 注入) | 静态网络、主机名与 hosts、root 口令哈希、SSH 公钥、禁用口令认证、关闭 swap |
是否停服:不停服。不重启宿主、不动 br0/物理网卡、不修改既有 13 台域的任何定义与磁盘。
窗口期:无人值守安装按同规格实测(约 6–10 分钟/台)推算,并发度 2、共 5 台, 约 20–30 分钟。期间宿主 HDD 持续写入、CPU 与 IO 负载上升,属预期现象。
在跑业务:openwrt 1 台、k8s 4 台、slurm 5 台、lustre 2 台处于运行态(k8s-master-02/03 shut off), 本次变更不触碰它们。
5. 分步操作¶
对应实现文件:
deployer.py(生命周期编排)、main.py(入口)、config_schema.py(配置校验)、templates/ks.cfg.tmpl(kickstart 模板);配置:config/hosts-20260924-lsf.yaml。 以下为与实现等价的操作序列,供阅读与手工复现;幂等、备份与错误处理由实现体保证。 命令均在工程根目录kvm_rocky9_deploy/下执行。
5.1 只读体检(门禁,不取锁、不改状态)¶
sudo .venv/bin/python main.py --precheck --config config/hosts-20260924-lsf.yaml
# 期望:门禁检查:共 10 项(通过 10、告警 0、阻断 0),退出码 0
# 报告:build/reports/precheck-hosts-20260924-lsf-<时间戳>.txt
5.2 只读漂移检测¶
sudo .venv/bin/python main.py --drift --config config/hosts-20260924-lsf.yaml
# 期望(变更前):待变更 10 项(5 个卷 + 5 个域),探测失败 0 项,退出码 4
# 期望(变更后):未发现漂移,退出码 0
5.3 预演(零系统改动)¶
sudo .venv/bin/python main.py --dry-run --config config/hosts-20260924-lsf.yaml
# 期望:逐项打印「将创建卷…」「将创建域并无人值守安装…」,不创建任何对象
# 产物:build/plans/plan-hosts-20260924-lsf-<时间戳>.yaml(仅工程内文件)
5.4 实跑(创建 5 台)¶
sudo .venv/bin/python main.py --config config/hosts-20260924-lsf.yaml
# 内部顺序(与实现体一致):
# 门禁(环境预检查 + 配置校验)→ 三态巡检(UNKNOWN 即中止)→ 写计划文件 → 真实变更
单台内部动作,等价手工序列:
# ① 创建系统卷(稀疏分配,不预占宿主空间;已存在则跳过)
virsh --connect qemu:///system vol-create-as hdd-pool lsf-master-01.qcow2 20G --format qcow2
# ② 渲染 kickstart 到 build/<主机名>/ks.cfg(含静态网络、hosts、口令哈希、公钥、
# 禁用口令认证、关闭 swap),并用 virt-install 启动无人值守安装
virt-install --connect qemu:///system \
--name lsf-master-01 \
--memory 4096 --vcpus 4 --cpu host-passthrough --machine pc \
--osinfo name=rocky9 \
--disk path=/data/kvm/img/lsf-master-01.qcow2,format=qcow2,bus=virtio,cache=none,io=native,discard=unmap \
--network bridge=br0,mac=52:54:00:31:0d:01,model=virtio \
--location /data/kvm/iso/Rocky-9-latest-x86_64-dvd.iso \
--initrd-inject build/lsf-master-01/ks.cfg \
--extra-args "inst.ks=file:/ks.cfg inst.text console=tty0 console=ttyS0,115200n8" \
--graphics none --console pty,target_type=serial \
--memballoon model=virtio --autostart --noautoconsole
# 注意:不要加 --boot hd,它会覆盖 virt-install 的 direct kernel boot
# 其余 4 台同构,仅替换 --name / --memory / --vcpus / --disk / --mac
# ③ 等待安装结束(kickstart 以 poweroff 收尾;实现体按 15s 轮询,上限 2400s)
virsh --connect qemu:///system domstate lsf-master-01 # 期望 shut off
# ④ 固化域定义:去 direct boot、改为硬盘引导、注入气球策略,然后启动
virsh --connect qemu:///system dumpxml lsf-master-01 --inactive > build/lsf-master-01/domain.xml
virsh --connect qemu:///system define build/lsf-master-01/domain.xml
virsh --connect qemu:///system start lsf-master-01
# ⑤ 内存气球策略(deflate-on-oom)
# libvirt 10.0 的能力检测误判 QEMU 不支持该属性,写在 <memballoon> 内会被静默丢弃;
# 实测 QEMU 8.2 支持,故经 qemu:commandline 传 -global 绕过。
# 【高危】以下操作会关闭并重启该主机,请在业务空闲窗口执行(新建主机此时无业务,风险可控)
virsh --connect qemu:///system destroy lsf-master-01
virsh --connect qemu:///system define build/lsf-master-01/domain.xml # 已含 qemu:commandline
virsh --connect qemu:///system start lsf-master-01
# ⑥ 设置开机自启
virsh --connect qemu:///system autostart lsf-master-01
5.5 幂等复跑¶
sudo .venv/bin/python main.py --config config/hosts-20260924-lsf.yaml
# 期望:状态巡检:全部项已达标,无需变更 / 状态: skipped,零变更
6. 验证¶
# 1) 域状态:5 台均为 running,且既有 13 台域状态不变
virsh --connect qemu:///system list --all
# 2) 引导方式已固化:不应出现 <kernel>/<initrd>
virsh --connect qemu:///system dumpxml lsf-master-01 --inactive | grep -cE "<kernel>|<initrd>" # 期望 0
# 3) 内存气球策略:应输出 -global 与 virtio-balloon-pci.deflate-on-oom=on
virsh --connect qemu:///system dumpxml lsf-master-01 | grep -A4 qemu:commandline
# 4) 主机内部(对 5 台逐一执行,IP 取 .23–.27)
ssh -o BatchMode=yes root@192.168.31.23 '
hostname; cat /etc/redhat-release; nproc; free -h | tail -n1;
sshd -T | grep -i ^passwordauthentication;
wc -l < /root/.ssh/authorized_keys;
grep -c "[[:space:]]swap[[:space:]]" /etc/fstab'
# 期望:主机名与配置一致、Rocky Linux 9.x、nproc 与规格一致、swap 合计 0B、
# passwordauthentication no、授权密钥 1 行、fstab 中 swap 行已注释
# 5) 磁盘容量
virsh --connect qemu:///system domblklist lsf-work-01 # 系统盘指向 100G 卷
qemu-img info /data/kvm/img/lsf-work-01.qcow2 | grep virtual
# 6) 既有环境未受影响的抽查
virsh --connect qemu:///system dumpxml k8s-master-01 | grep -c "52:54:00:31:0a:01" # 期望 1
sysctl -n vm.swappiness # 期望 10(本批次未改动)
systemctl is-enabled ksm.service # 期望 enabled(本批次未改动)
# 7) 幂等复跑:第二次应零变更
sudo .venv/bin/python main.py --config config/hosts-20260924-lsf.yaml
# 期望输出:状态巡检:全部项已达标,无需变更 / 状态: skipped
# 8) 工具侧回归(只读)
sudo .venv/bin/python main.py --drift --config config/hosts-20260918.yaml # 期望退出码 0
实测结果:见本文件末尾「附录 B:执行记录」。
7. 回滚¶
备份方式:实现体在改写既有文件前自动做带时间戳备份(<文件名>.bak.<YYYYmmdd-HHMMSS>);
本次全部备份集中在 lsf-20260924/backup/,逐条台账见 lsf-20260924/backup/README.md
(含每个备份的原路径、产生时间、回滚对象与可删时点)。
回滚旧批次虚机(本批次自身)
# 高危:销毁本配置中的全部 5 台主机与其磁盘数据(不可恢复)
sudo .venv/bin/python main.py --rollback --force --config config/hosts-20260924-lsf.yaml
# 说明:不带 --force 时会要求交互输入 YES 确认;预演(--dry-run --rollback)只列清单不执行
由于本配置未包含 host_tuning,回滚只删主机与磁盘,不会触碰宿主内核参数与 KSM 服务。
等价的手工操作:
# 逐台执行(仅作用于本批次主机)
virsh --connect qemu:///system destroy lsf-master-01 # 高危:强制关闭
virsh --connect qemu:///system undefine lsf-master-01 --remove-all-storage # 高危:连磁盘一并删除
# lsf-master-02 / lsf-work-01 / lsf-work-02 / lsf-work-03 同理
# 清理本次凭据文件(含明文口令)
rm -f config/credentials-lsf.yaml # 高危:删除凭据文件
回滚工具侧改造(还原到改造前实现)
cd lsf-20260924/backup
cp -p utils/kvm_utils.py.bak.20260924-020251 ../../utils/kvm_utils.py # 先还原共享能力
cp -p deployer.py.bak.20260924-020251 ../../deployer.py
cp -p main.py.bak.20260924-020251 ../../main.py
cp -p deploy.yaml.bak.20260924-020251 ../../config/deploy.yaml
cp -p deploy.yaml.example.bak.20260924-020251 ../../config/deploy.yaml.example
# 新增文件(config_schema.py、config/hosts-20260924-lsf.yaml)按需删除
回滚后验证
virsh list --all中不再出现 5 台 lsf 主机,且既有 13 台域状态与变更前一致virsh vol-list --pool hdd-pool中不再出现lsf-*.qcow2sysctl -n vm.swappiness仍为 10、systemctl is-enabled ksm.service仍为 enabled- 还原工具后,对既有批次跑
main.py --config config/hosts-20260918.yaml仍为skipped
8. 风险说明¶
| 风险点 | 影响 | 缓解措施 |
|---|---|---|
| 宿主内存压力 | 本批次名义 54 GiB,变更前 available 仅 52 GiB;若 Guest 真实用量接近分配值,可能触发宿主 OOM | 5 台均启用 deflate-on-oom(宿主吃紧时 Guest 自动归还内存);并发度限制为 2;执行后观察 free -g,必要时 virsh autostart --disable 部分主机 |
| 静态 IP 与路由器 DHCP 池冲突 | 间歇性断网,且难归因 | 使用方已确认 .23–27 不冲突;变更后用 arping/ping 复核无重复应答 |
--boot hd 覆盖 direct boot |
域无 <kernel>,主机从空盘引导后立即关机,且无日志 |
不传 --boot;安装后由实现体移除 direct boot 参数 |
| kickstart 以 reboot 收尾会循环安装 | 域定义仍带 direct boot,重启再次进安装器 | 模板固定 poweroff 收尾,由实现体固化定义后再启动 |
| libvirt 静默丢弃 deflate-on-oom | virsh define 返回成功但配置未生效 |
经 qemu:commandline 传 -global;验证时直接查域 XML |
| 并发安装争抢 HDD IO | 安装变慢 | 并发度限制为 2(runtime.install_max_concurrent);如需更快可提高,但会加剧争抢 |
| 关闭 swap 的影响 | 内存超用时无换页兜底,进程可能被 OOM 终止 | 由 vm_defaults.disable_swap 控制;若使用方需要 swap,改为 false 重建即可 |
| 配置取值进入 guest 内脚本 | 错误的挂载点/主机名可能破坏 kickstart 或造成脚本注入 | config_schema.validate_config() 对主机名、IP、MAC、卷名后缀、挂载点做白名单与唯一性校验,不通过则门禁阻断 |
| root 口令 | 明文落盘 | 未在配置中指定时由实现体随机生成 24 位口令存于 config/credentials-lsf.yaml(已 gitignore),供控制台兜底登录 |
| 改造影响既有批次 | 三个既有批次的执行路径共用同一实现体 | 改造后先跑只读回归(--drift 既有 slurm 批次得 0 漂移、真实执行得 skipped),再对本批次动手 |
| 历史文档漂移 | docs/SOP.md、docs/SOP-hosts-20260918.md 为改造前文档,其中的 CLI 用法(如 --rollback 无需 --force)已过时 |
以本文件与实现体为准;两处可加一行「已被 lsf-20260924/SOP.md 的 CLI 变更覆盖」 |
附录 A:交付物清单¶
| 路径 | 说明 |
|---|---|
config/hosts-20260924-lsf.yaml |
LSF 批次配置(5 台) |
config_schema.py |
配置合法性校验模块 |
deployer.py、main.py、utils/kvm_utils.py |
改造后的实现体 |
lsf-20260924/SOP.md |
本文件 |
lsf-20260924/backup/、lsf-20260924/backup/README.md |
被改文件备份与其台账 |
build/plans/plan-hosts-20260924-lsf-*.yaml |
变更计划(实现体产物) |
build/reports/precheck-*.txt、build/reports/drift-*.txt |
只读子命令报告(实现体产物) |
logs/kvm-rocky9-deploy.log |
执行日志 |
附录 B:执行记录¶
B.1 只读验证(改造后、实跑前)¶
| 命令 | 结果 |
|---|---|
--precheck(LSF 配置) |
通过 10 项、告警 0、阻断 0,退出码 0 |
--drift(LSF 配置,变更前) |
待变更 10 项(5 卷 + 5 域)、探测失败 0,退出码 4 |
--drift(既有 slurm 批次) |
无漂移,退出码 0(回归通过) |
--dry-run(LSF 配置) |
域列表 / 卷列表 / 镜像目录指纹前后一致 → 零系统改动 |
| 真实执行(既有 slurm 批次) | 状态: skipped,零变更(幂等回归通过) |
| 静态符号检查 | deployer.py 引用的 ku.* 全部存在 |
B.2 实跑过程¶
首次执行因实现体缺陷中断:重写
utils/kvm_utils.py时漏掉仍被_create_domain使用的vol_path(),导致AttributeError;当时已创建 5 个系统卷、未创建域。 补回该函数后复跑,卷创建因幂等被全部跳过,继续完成域创建与安装。 教训:--dry-run不覆盖_create_domain路径,故预演通过不等于创建路径无缺陷; 已补静态符号检查作为补充手段。
- 执行:
sudo .venv/bin/python main.py --config config/hosts-20260924-lsf.yaml - 结果:
状态: success | 耗时: 2339.94s;总主机数 5、成功 5、失败 0、跳过 0,退出码 0 - 计划文件:
build/plans/plan-hosts-20260924-lsf-20260924-021219.yaml(10 项) - 单台节奏(并发 2):安装阶段约 11–14 分钟/台,固化 + 等待 SSH 就绪约 40 秒
- 首次失败后的复跑:5 个卷因幂等被全部跳过,未重复创建
B.3 变更后验证(全部通过)¶
| 验证项 | 命令 | 实测结果 |
|---|---|---|
| 域状态 | virsh list --all |
5 台 lsf 全部 running;既有 13 台状态不变(k8s 4 运行 + 2 shut off、slurm 5、lustre 2、openwrt 1) |
| 引导固化 | dumpxml <域> --inactive 取 <kernel>/<initrd> 计数 |
5 台全为 0 |
| 内存气球 | dumpxml <域> 取 deflate-on-oom=on 计数 |
5 台全为 1 |
| 开机自启 | dominfo <域> 取 Autostart |
5 台全为 enable |
| 主机名与版本 | ssh root@<ip> hostname;grep ^VERSION_ID /etc/os-release |
lsf-master-01/02、lsf-work-01~03;均为 Rocky 9.8 |
| 规格 | nproc |
4 / 2 / 8 / 8 / 8,与配置逐台一致 |
| swap | free -h;/etc/fstab 未注释 swap 行计数 |
5 台 Swap 0B;未注释 swap 行 0 |
| 登录方式 | sshd -T 取 passwordauthentication;wc -l /root/.ssh/authorized_keys |
5 台全为 no;授权密钥 1 行 |
| 磁盘 | ls -l /data/kvm/img/ |
5 个 qcow2 稀疏分配,当前约 3 GiB/盘(名义 20G/100G) |
| 既有环境 | dumpxml k8s-master-01 取 MAC 计数;sysctl -n vm.swappiness;systemctl is-enabled ksm.service |
1;10;enabled(均未受影响) |
| 幂等 | 实跑后连续两次真实复跑 | 两次均 状态: skipped、约 0.9s、零变更 |
| 漂移检测 | --drift(LSF 配置) |
未发现漂移,退出码 0 |
| 工具回归 | --drift(既有 slurm 批次) |
未发现漂移,退出码 0 |
| 宿主内存 | free -g |
available 44 GiB(变更前 52 GiB;5 台名义 54 GiB,由气球 + 稀疏分配兜住) |
结论:需求一、需求二的目标项全部达成,无遗留阻塞项。
附录 C:遗留事项(本档未做,已在改造范围外登记)¶
| 事项 | 状态 | 说明 |
|---|---|---|
环境契约 contract.yaml |
未做 | 本工程为单机本机执行,契约中的 os/arch/kernel 断言收益有限;已用实现体常量 KVM_DEVICE/REQUIRED_COMMANDS 承担部分职责 |
| bundle + manifest 自包含交付 | 未做 | 迁移到新宿主时仍需人工核对 libvirt/ISO/池前提 |
| 离线优先与回落白名单 | 不适用 | 本工程不安装软件包,ISO 为本地文件 |
| 批次失败阈值与自动回滚 | 未做 | 当前为并发 2 的线程池,单台失败记录后继续其余主机;auto_rollback 保持关闭(默认) |
| 执行通道 provider 抽象 | 未做 | 本工程定位即「本机执行」,远程执行由共享库的 SSH 模块另行承担 |
来源:
/home/rain/Documents/kvm/kvm_rocky9_deploy/lsf-20260924/SOP.md| 最后更新:2026-09-24 03:07(由build/sync.py同步,请勿在站点侧修改)