跳转至

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 同步,请勿在站点侧修改)