SSSD 集群部署 SOP¶
背景¶
Slurm 26.05 升级后发现 fetch_identity() 新机制要求 slurmctld 本机必须能解析作业用户。k8s 升级期间 LDAP pod 短暂不可达 → nslcd 断连 → getent passwd rain01 返回空 → srun 报 Error generating job credential。
根因:只有 nslcd(纯 LDAP 直连,无缓存),LDAP 闪断时整个节点用户解析瘫痪。
解法:安装 sssd 作为主用户解析后端(有本地缓存,LDAP 闪断时扛得住),nslcd 保留作为 fallback。nsswitch 顺序统一为 sss ldap files。
目标¶
为集群所有节点(control + compute + submit)安装 sssd,实现: - LDAP 闪断时 用户解析零中断(sssd 本地缓存) - slurmctld 的 fetch_identity() 不再因 LDAP 断连而失败 - 幂等部署:重复执行零变更
前置条件¶
| 条件 | 检查方法 |
|---|---|
| 节点能通过 SSH root 免密登录 | ssh root@<ip> true |
| yum 仓库可用 | yum list installed sssd |
| 已有 LDAP 基础设施 | ldapsearch -x -H ldap://<ldap-ip> -b <base-dn> uid=rain01 |
| LDAP 服务器端口可达 | timeout 3 bash -c 'echo >/dev/tcp/<ldap-ip>/389' |
文件清单¶
deploy/sssd/
├── install_sssd.sh # 主脚本
├── config/
│ └── sssd.conf.template # sssd 配置模板(__占位符__)
└── docs/
└── SOP.md # 本文件
分步操作¶
步骤 1:预演(dry-run)¶
cd /home/rian/Documents/slurm_ins/deploy/sssd
bash install_sssd.sh \
--dry-run \
--targets "192.168.0.2 192.168.0.5 192.168.0.6 192.168.0.7" \
--ldap-uri ldap://192.168.0.2/ \
--ldap-base dc=rainchen,dc=com
预期输出:只有 [DRY-RUN] 标记的动作,不改动任何系统状态。
步骤 2:正式部署¶
bash install_sssd.sh \
--targets "192.168.0.2 192.168.0.5 192.168.0.6 192.168.0.7" \
--ldap-uri ldap://192.168.0.2/ \
--ldap-base dc=rainchen,dc=com
预期输出:每个节点显示 ✅ sssd 部署成功,LDAP 用户可解析。
步骤 3:验证¶
3.1 sssd 服务状态¶
for ip in 192.168.0.2 192.168.0.5 192.168.0.6 192.168.0.7; do
echo -n "$ip: "
ssh root@$ip "systemctl is-active sssd"
done
3.2 LDAP 用户解析¶
for ip in 192.168.0.2 192.168.0.5 192.168.0.6 192.168.0.7; do
echo -n "$ip: "
ssh root@$ip "getent passwd rain01 | cut -d: -f1,3"
done
预期输出:全部显示 rain01:2001。
3.3 LDAP 断连韧性测试(关键!)¶
# 在 192.168.0.7 上模拟 nslcd 断连
ssh root@192.168.0.7 "
systemctl stop nslcd
echo '停 nslcd 后 getent rain01:'
timeout 2 getent passwd rain01 && echo '✅ sssd 缓存命中' || echo '❌ sssd 缓存未命中'
systemctl start nslcd
"
预期:sssd 缓存命中,getent 在 LDAP 不可达时仍能返回结果。
3.4 Slurm 作业端到端验证¶
ssh root@192.168.0.2 "runuser -u rain01 -- bash -c 'srun -N3 hostname'"
步骤 4:回滚(如需)¶
bash install_sssd.sh \
--rollback \
--targets "192.168.0.7"
回滚动作:
1. 停 sssd + 禁用自启
2. 恢复 sssd.conf 备份(或删除无备份时)
3. nsswitch 恢复为 ldap files 顺序
4. 验证 nslcd 仍可解析 LDAP 用户
风险说明¶
| 风险 | 概率 | 影响 | 缓解 |
|---|---|---|---|
| sssd.conf 写错导致 getent 失败 | 中 | 所有 LDAP 用户查询卡住 | 脚本自动备份 + 幂等检查,可一键回滚 |
| nsswitch 顺序改反(files sss ldap) | 低 | 本地用户覆盖 LDAP 同名用户 | 脚本强制 sss ldap files,脚本内有硬编码 |
| 控制节点部署时 slurmctld 用户解析中断 | 低 | 作业提交全部失败 | 先在计算节点试装验证,再推控制节点 |
| yum install 网络超时 | 低 | 安装卡住 | 脚本有 set -e,失败即停,不继续推送坏配置 |
常见故障排查¶
故障 1:getent passwd rain01 返回空¶
# 1. 看 sssd 状态
systemctl status sssd
journalctl -u sssd -n 20
# 2. 看 sssd.conf 语法
sssd --debug-to-files 2>&1 | head -5
# 或直接看
ls -la /etc/sssd/sssd.conf # 必须 600 权限
# 3. 手动连通 LDAP
timeout 3 bash -c 'echo >/dev/tcp/192.168.0.2/389'
ldapsearch -x -H ldap://192.168.0.2/ -b dc=rainchen,dc=com uid=rain01
# 4. 清除 sssd 缓存重试
sss_cache -E
故障 2:sssd 启动失败¶
# sssd.conf 权限必须 600
chmod 600 /etc/sssd/sssd.conf
# 检查 SELinux(CentOS 7 上可能阻止 sssd 访问 LDAP 端口)
getenforce
setsebool -P sssd_use_ldap_ports on 2>/dev/null || true
故障 3:LDAP 断连后 sssd 缓存也失败¶
# sssd 缓存文件位置
ls -la /var/lib/sss/db/
# 清除缓存重新同步
rm -f /var/lib/sss/db/*
systemctl restart sssd
# 等 LDAP 恢复后 sssd 自动同步
后续维护¶
| 场景 | 操作 |
|---|---|
| 新增节点 | bash install_sssd.sh --targets "新IP" ...(幂等,可重复) |
| LDAP 服务器换地址 | 改 install_sssd.sh 参数 --ldap-uri,重跑即可(脚本检测哈希变化会覆盖) |
| 切换到 TLS | 改模板 ldap_id_use_start_tls=True + 加 ldap_tls_cacertdir,重跑脚本 |
| 想装 sssd 但不用 LDAP(IPA/AD) | 改模板 id_provider/auth_provider 为 ipa 或 ad |
与 Slurm 部署脚本的关系¶
本脚本是 独立模块,不依赖 deploy/slurm/ 下的代码。Slurm 部署脚本(slurm_deployer.py)当前未集成 sssd 部署,但建议在 pre_check() 阶段增加 LDAP 连通性巡检(getent passwd <testuser> 失败时报错退出)。
来源:
/home/rain/Documents/services/sssd/docs/SOP.md| 最后更新:2026-09-03 15:49(由build/sync.py同步,请勿在站点侧修改)