跳转至

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. 目标

  1. .21/.22 装上 sssd 并配置 LDAP 域,服务 active + enabled;
  2. getent -s sss passwd rain01、getent -s sss group dv 能解析出 LDAP 条目;
  3. lfs quota -u rain01 /mnt/lustre 可用;
  4. 幂等:复跑第二次零变更、全跳过;
  5. 接入逻辑沉淀为可复用能力(共享库 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 同步,请勿在站点侧修改)