SOP · 存储服务端 LDAP 客户端接入(sssd)¶
- 主题:
ldap_client_20261012 - 日期:2026-10-12
- 类型:C 类变更(共享库新增能力 + 工程新增模块 + 两台存储服务端变更)
- 触发来源:
slurm_ins《EDA 集群存储与服务拓扑巡检报告》§5 G6(LDAP 未覆盖存储服务端.21/.22)
1. 背景¶
.21(MGS/MDS)、.22(OSS)两台 Lustre 服务端未接 LDAP,靠 /etc/passwd、/etc/group
里的本地镜像条目绕过:实测只有 rain01:2001 与 design:2000 两条,其余 7 个职能组
(dv/custom/layout/cad/sre/pnr/signoff)在服务端解析不出。后果是 lfs quota 按用户/组的能力受限、
文件属主在服务端只能以数字 UID/GID 呈现,且身份源两套(本地 + LDAP),长期有 UID/GID 漂移风险。
按 2026-10-12 裁定采用 B 方案:在共享库新增可复用的 sssd 客户端能力,lustre_ins 直接调用;
slurm_ins / lsf_ins 的存量实现先不动(登记待统一)。
2. 目标¶
.21/.22装上 sssd 并配置 LDAP 域,服务 active + enabled;getent -s sss passwd rain01、getent -s sss group dv能解析出 LDAP 条目;lfs quota -u rain01 /mnt/lustre可用;- 幂等:复跑第二次零变更、全跳过;
- 接入逻辑沉淀为可复用能力(共享库
sssd_client),供后续工程调用。
3. 前置条件¶
| 条件 | 检查方法 |
|---|---|
| 目标机 root SSH 免密 | 执行前用 remote_exec.py 复核两台可达 |
已装 authselect |
command -v authselect(两台实测已装 1.2.6) |
| LDAP 服务可达 | ldap://192.168.31.10:389(k8s pod,traefik 透传) |
| 凭据可用 | 从 slurm_ins/config/slurm_deploy.yaml 的 user_mgmt.ldap.* 同源取值 |
| 无关键作业受影响 | 服务端不跑作业;变更期 Lustre 服务保持在线 |
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 主机 | 192.168.31.21(MGS/MDS)、192.168.31.22(OSS),2 台 |
| 组件 | /etc/sssd/sssd.conf(新建)、authselect 接管 PAM/NSS、sssd 服务;共享库 sssd_client.py、lustre_ins modules/ldap_client.py 与配置 |
| 停服 | 否。装包与配置期间 Lustre 服务保持在线的;不变更 Lustre 任何配置 |
| 窗口 | 无窗口要求;单次执行实测约 112 s(含 dnf 装包) |
| 在跑业务 | 服务端不跑作业;变更前后 lfs df -h 均正常 |
5. 分步操作¶
实现体:lustre_ins/modules/ldap_client.py(薄封装)+ 共享库 ~/py_public_modules/sssd_client.py;
配置:lustre_ins/config/deploy.yaml 的 ldap_client: 段。以下为等价操作序列。
步骤 1:配置 ldap_client 段(含凭据)¶
ldap_client:
enabled: true
hosts: [] # 留空 = 取 nodes.mgs_mds + nodes.oss 的 host
domain_name: eda
ldap_uri: ldap://192.168.31.10:389
ldap_search_base: dc=rainchen,dc=com
ldap_bind_dn: cn=admin,dc=rainchen,dc=com
ldap_bind_password: "<从 slurm_ins 同源凭据填入>"
authselect_profile: sssd
authselect_features: [with-mkhomedir]
verify_user: rain01
verify_group: design
backup_dir: /var/backups/sssd
坑:
- 该文件含 LDAP bind 密码,权限必须 600(原为 644,本次已收紧);勿入库、勿粘贴到命令行;
- 凭据与 slurm_ins 同源,LDAP 密码轮换时两处需同步更新。
步骤 2:预演(零副作用)¶
cd /home/rain/Documents/lustre_ins
.venv/bin/python main.py add-ldap-client --config config/deploy.yaml --dry-run
预期:ldap_client 模块对两台输出 [dry-run] 将执行变更: 将以 sssd 接入 <host>,
状态 success、跳过 0,远端只发只读探测(一条拼接 shell/台)。
步骤 3:执行接入¶
cd /home/rain/Documents/lustre_ins
.venv/bin/python main.py add-ldap-client --config config/deploy.yaml
节点侧等价命令(实现体逐台幂等执行,先备份再变更):
# ① 备份(高危前置)
install -d /var/backups/sssd
[ -f /etc/sssd/sssd.conf ] && cp -p /etc/sssd/sssd.conf \
/var/backups/sssd/sssd.conf.bak.$(date +%Y%m%d-%H%M%S)
authselect current > /var/backups/sssd/authselect.before.$(date +%Y%m%d-%H%M%S)
# ② 装包
dnf -y install sssd sssd-ldap oddjob oddjob-mkhomedir
# ③ 写 sssd.conf(权限 600,否则 sssd 拒绝启动)
install -m 600 /dev/stdin /etc/sssd/sssd.conf <<'EOF'
[sssd]
config_file_version = 2
services = nss, pam
domains = eda
[domain/eda]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://192.168.31.10:389
ldap_search_base = dc=rainchen,dc=com
ldap_schema = rfc2307
ldap_default_bind_dn = cn=admin,dc=rainchen,dc=com
ldap_default_authtok = <凭据>
ldap_default_authtok_type = password
ldap_id_mapping = false
ldap_tls_reqcert = never
cache_credentials = true
enumerate = false
EOF
# ④ authselect 接管 PAM/NSS(高危:改 PAM,先确认 getent 与 SSH 正常)
authselect select sssd with-mkhomedir --force
# ⑤ 启动并设自启
systemctl enable --now sssd
预期:两台 状态: success,耗时约 112 s。失败判断:任一台 [ERROR](装包/authselect/启动失败)
→ 按第 7 章回滚后重跑。
步骤 4:验证¶
见第 6 章。
6. 验证¶
# ① 幂等复跑:应「sssd 已符合期望,跳过」
cd /home/rain/Documents/lustre_ins
.venv/bin/python main.py add-ldap-client --config config/deploy.yaml
# ② 实机核对(两台)
python3 ~/py_public_modules/remote_exec.py --hosts 192.168.31.21,192.168.31.22 \
--probe "sssd=systemctl is-active sssd; systemctl is-enabled sssd" \
--probe "authselect=authselect current | head -3" \
--probe "sss_user=getent -s sss passwd rain01" \
--probe "sss_group=getent -s sss group dv" \
--probe "quota=lfs quota -u rain01 /mnt/lustre 2>&1 | head -3" \
--probe "confmode=stat -c %a /etc/sssd/sssd.conf"
实测(2026-10-12):
| 检查项 | 结果 |
|---|---|
| 幂等复跑 | 总主机数: 2 | 成功 0 | 跳过 2,耗时 0.36 s |
| sssd 服务 | 两台 active + enabled |
| authselect | 两台 Profile ID: sssd,feature with-mkhomedir |
getent -s sss passwd rain01 |
rain01:*:2001:2000:rain01:/home/rain01:/bin/csh(LDAP 真实值) |
getent -s sss group dv |
dv:*:3000:(此前本地无此组) |
lfs quota -u rain01 /mnt/lustre |
.21 正常返回配额表 |
sssd.conf 权限 |
600 |
| sssd 缓存 | /var/lib/sss/db/cache_eda.ldb 已建立 |
一个需要知晓的现状:authselect 的 sssd profile 把 nsswitch 设为
passwd: files sss(本地账号优先,Red Hat 默认),因此默认 getent passwd rain01
仍取本地镜像条目(gecos 写着 mirror of client LDAP);LDAP 值需 getent -s sss 才可见。
group 为 files [SUCCESS=merge] sss,故 LDAP 组(dv 等)可直接解析。
要彻底消除本地镜像遮蔽,需另立变更删除 /etc/passwd、/etc/group 的镜像条目。
7. 回滚¶
备份位置:ldap_client_20261012/backup/(工程侧文件),节点侧 /var/backups/sssd/。台账见 backup/README.md。
# 实现体内置回滚:停 sssd + authselect 回 minimal + 恢复 sssd.conf 备份
cd /home/rain/Documents/lustre_ins
.venv/bin/python main.py rollback --config config/deploy.yaml --force # 该子命令按路径备份通用恢复
# 或逐台手工回滚
systemctl disable --now sssd
authselect select minimal --force
latest=$(ls -1t /var/backups/sssd/sssd.conf.bak.* 2>/dev/null | head -1)
[ -n "$latest" ] && cp -p "$latest" /etc/sssd/sssd.conf
回滚后验证:getent passwd rain01 仍返回本地镜像条目(不受影响);sssd 停用。
8. 风险说明¶
| 风险 | 说明与缓解 |
|---|---|
| authselect 接管 PAM 影响登录/解析 | nsswitch 为 files sss(本地优先,root 等本地账号不受影响);sss 不可用时可回退 files;变更前后 SSH 均正常 |
| sssd.conf 写错致 sssd 起不来 | 配置文件由实现体渲染(与 slurm 同口径);写入用 install -m 600;失败即报错并保留备份 |
| 变更期影响 Lustre 服务 | 本次不改 Lustre 任何配置,只装 sssd 与改认证;lfs df -h 变更前后均正常 |
| 凭据落盘 | deploy.yaml 已收紧为 600,与 slurm 同源;文档不落值 |
| 本地镜像条目与 LDAP 冲突 | uid/gid 一致(2001/2000),行为等价;getent -s sss 可验证 LDAP 侧值;彻底清理另立变更 |
附录:交付物清单¶
| 文件 | 角色 |
|---|---|
| 本文件 | 变更档案 |
backup/ |
工程侧被改文件快照 + backup/README.md 台账 |
~/py_public_modules/sssd_client.py |
共享库新增能力(渲染 + 三态判定 + 应用 + 回滚) |
lustre_ins/modules/ldap_client.py |
工程侧模块(薄封装) |
lustre_ins/config/deploy.yaml |
ldap_client: 配置段 |
来源:
/home/rain/Documents/lustre_ins/ldap_client_20261012/SOP.md| 最后更新:2026-10-12 00:31(由build/sync.py同步,请勿在站点侧修改)