跳转至

LDAP 组织结构改造计划(EDA 芯片公司职能组织)

状态:已执行完成(2026-09-12),幂等达标 范围:LDAP 组织结构(ou/cn)、用户归属、/projects 目录、Slurm 账户 执行结果:38 项变更全部完成(详见文末"执行结果")


一、背景与目标

当前 LDAP 的部门/组(dev/ops/IT + teama*/teamb*/teamc*)是早期随意创建的, 与 EDA 芯片公司 HPC 的职能组织模型不对应,导致:

  • 组名无法体现岗位(谁做 RTL、谁做验证、谁做版图)
  • /projects 目录名(teama/teamb/teamc)无业务含义
  • 无法按职能做工具可见性、License 计费、数据权限的精细划分

目标:改建为标准的 EDA 职能组织结构,且尽量不触及现有文件属组。


二、现状 → 目标

2.1 现状

dc=rainchen,dc=com
├── ou=dev  → cn=teama (2000)  [rain01, rain02, rain03]   cn=teama1 (3000) [cloud01]
├── ou=ops  → cn=teamb (4000)  [cy01]                     cn=teamb1 (5000) [david01]
└── ou=IT   → cn=teamc (6000)  [lws01]                    cn=teamc1 (6100) [cq01]

2.2 目标(EDA 职能组织)

dc=rainchen,dc=com
└── ou=eda
    ├── ou=frontend   前端设计
    │   ├── cn=design    gid 2000   ← teama   [rain01, rain02, rain03]
    │   └── cn=dv        gid 3000   ← teama1  [cloud01]
    ├── ou=analog     模拟/混合信号
    │   ├── cn=custom    gid 4000   ← teamb   [cy01]
    │   └── cn=layout    gid 5000   ← teamb1  [david01]
    ├── ou=backend    后端实现(预留)
    │   ├── cn=pnr       gid 6200   (新,空)
    │   └── cn=signoff   gid 6220   (新,空)
    └── ou=it         IT/CAD
        ├── cn=cad       gid 6000   ← teamc   [lws01]
        └── cn=sre       gid 6100   ← teamc1  [cq01]

2.3 映射表与"GID 复用"(核心设计)

旧 ou/cn gid 成员 新 ou/cn 新 gid
dev/teama 2000 rain01/02/03 frontend/design 2000
dev/teama1 3000 cloud01 frontend/dv 3000
ops/teamb 4000 cy01 analog/custom 4000
ops/teamb1 5000 david01 analog/layout 5000
IT/teamc 6000 lws01 it/cad 6000
IT/teamc1 6100 cq01 it/sre 6100
— — — backend/pnr 6200(新)
— — — backend/signoff 6220(新)

关键:GID 全部复用 → 用户 gidNumber 不变 → /home/*、/projects/* 所有文件属组无需 chown。 这是本方案风险最低的原因(对比"重排 GID"需全量 chown,风险高)。

说明:用户通过 gidNumber 关联主组,GID 复用后其主组会自动"变成"新组名(因为 gid 号对应的组名变了), 无需改用户属性。若需次要组(memberUid)能力,需额外维护组成员列表。


三、前置条件

  • LDAP pod 可访问(openldap-0 @ server 命名空间),管理员凭据取自 pod 内 LDAP_ADMIN_PASSWORD
  • 客户端已接 LDAP(sssd),NFS Server 未接(故文件操作用数字 GID)
  • 建议无作业窗口执行(用户会短暂受影响)
  • 已备份:LDAP(slapcat)+ /projects、/home 属主清单

四、实施步骤(顺序关键)

  1. 备份 bash # LDAP 全量导出(演示) kubectl exec -n server openldap-0 -- sh -c 'slapcat' > ldap_backup.ldif # 目录属主清单 ls -ln /home /data/eda/projects > dir_owners_backup.txt
  2. 创建新 OU:ou=eda → frontend/analog/backend/it
  3. 创建职能组:design/dv/custom/layout/pnr/signoff/cad/sre(posixGroup + gidNumber)
  4. 迁移用户:modrdn 把用户从旧 cn 移到新 cn(newsuperior),GID 不变
  5. 删除旧部门:ou=dev/ops/IT(脚本会先校验子树为空才删)
  6. /projects 改名:teama→design、teama1→dv、teamb→custom、teamb1→layout、teamc→cad、teamc1→sre(仅改名,GID 不变)
  7. Slurm 账户重同步(执行阶段需手工确认) bash # 重跑同步脚本(演示) bash /data/slurm/tools/slurm_ldap_sync.sh # 清理旧账户(演示,需确认无活跃作业) sacctmgr -i delete account teama,teama1,teamb,teamb1,teamc,teamc1
  8. 清客户端缓存:sss_cache -u <user>(脚本自动执行)
  9. 验证(见第六节)

五、风险与影响

# 影响面 变化 风险 缓解
1 LDAP DN uid=X,cn=teama,ou=dev → uid=X,cn=design,ou=frontend,ou=eda 中 先建新、再移、后删;有备份
2 用户 gidNumber 不变(复用 GID) 低 无需 chown 文件
3 Slurm 账户 新建新职能账户;旧账户需清理 中 确认无活跃作业后 sacctmgr delete
4 /projects 目录 改名 低 仅 mv,GID 不变
5 历史记账 sacct 保留旧账户名历史 低 可接受
6 作业中断 迁移期间用户登录/提交可能失败 中 选无作业窗口
7 客户端缓存 改组后 getent 可能返回旧值 低 脚本自动 sss_cache

回滚: - LDAP:用 slapcat 备份恢复;或反向 modrdn 移回 + 删除新结构 - /projects:mv 反向改回 - Slurm:重跑 slurm_ldap_sync.sh 恢复旧账户关联


六、验证(执行后)

# 1) LDAP 结构
kubectl exec -n server openldap-0 -- sh -c \
 'ldapsearch -x -H ldap://localhost -D cn=admin,dc=rainchen,dc=com \
  -w "$LDAP_ADMIN_PASSWORD" -b dc=rainchen,dc=com "(objectClass=posixGroup)" cn gidNumber' | grep -E '^(dn|cn|gidNumber):'

# 2) 用户 DN 已迁移
kubectl exec -n server openldap-0 -- sh -c \
 'ldapsearch -x -H ldap://localhost -D cn=admin,dc=rainchen,dc=com \
  -w "$LDAP_ADMIN_PASSWORD" -b dc=rainchen,dc=com "(uid=lws01)" dn gidNumber'

# 3) 客户端视角(组名应显示新职能组)
getent group 2000 6000        # → design / cad

# 4) /projects
ls -l /projects               # → design dv custom layout cad sre ...

# 5) 用户实际效果
su - lws01
id                            # groups=6000(cad)
touch /projects/cad/x && echo OK   # 组内可写

注意:用户 lws01 原来可写 /projects/teamc,改造后对应 /projects/cad(目录改名,权限不变)。


七、dry-run 预演结果(已执行,未改动系统)

幂等巡检完成:待变更 30 项

【OU 创建】5 项
  1) ou=eda   2) ou=frontend   3) ou=analog   4) ou=backend   5) ou=it

【职能组创建】8 项
  6) cn=design(2000)   7) cn=dv(3000)     8) cn=custom(4000)  9) cn=layout(5000)
 10) cn=pnr(6200)     11) cn=signoff(6220) 12) cn=cad(6000)   13) cn=sre(6100)

【用户迁移 modrdn】8 项(高危)
 14) rain01  15) cloud01  16) cy01   17) david01
 18) rain02  19) rain03   20) lws01  21) cq01

【旧部门清理】3 项(高危,脚本会先校验子树为空)
 22) ou=dev   23) ou=ops   24) ou=IT

【/projects 改名】6 项
 25) teama→design   26) teama1→dv     27) teamb→custom
 28) teamb1→layout  29) teamc→cad     30) teamc1→sre

复现命令:

cd /home/rian/Documents/slurm_ins/eda_storage_standardization/deploy
python3 main.py --dry-run        # 预演,不修改系统

八、待确认

  1. 职能映射是否符合预期(teama→design 等)?可按实际岗位调整
  2. 是否需要项目组维度(如 cn=proj_alpha)与职能组并存?
  3. 执行时机:确认在无作业窗口执行

九、执行结果(2026-09-12 已完成)

9.1 备份(执行前)

  • LDAP 全量:/root/ldap_backup.20260912_013844.ldif(284 行 / 18 条目)
  • 目录属主清单:/root/dir_owners_backup.20260912_013845.txt

9.2 变更(38 项 + 3 项补做)

分类 数量 结果
创建 OU 5 eda + frontend/analog/backend/it
创建职能组 8 design/dv/custom/layout/pnr/signoff/cad/sre
用户迁移 modrdn 8 rain01/02/03→design、cloud01→dv、cy01→custom、david01→layout、lws01→cad、cq01→sre
删除旧部门 3 dev/ops/IT 已删(补做,首轮因判定逻辑误跳过)
/projects 改名 6 teama→design、teama1→dv、teamb→custom、teamb1→layout、teamc→cad、teamc1→sre
新目录补齐 8 8 个职能目录(含新增 pnr/signoff)

9.3 Slurm 账户

  • 新职能账户已自动同步并关联用户(design/dv/custom/layout/cad/sre)
  • 旧账户 dev/ops/teama/teama1/teamb/teamb1/teamc/teamc1 已清理
  • 用户默认账户均指向新职能组

9.4 最终验证(实测)

幂等复验: 待变更 0 项(零变更、全跳过)

LDAP 组:  cn=design,ou=frontend,ou=eda (2000)   cn=dv,ou=frontend,ou=eda (3000)
          cn=custom,ou=analog,ou=eda (4000)     cn=layout,ou=analog,ou=eda (5000)
          cn=pnr,ou=backend,ou=eda (6200)       cn=signoff,ou=backend,ou=eda (6220)
          cn=cad,ou=it,ou=eda (6000)            cn=sre,ou=it,ou=eda (6100)

用户 DN:  uid=lws01,cn=cad,ou=it,ou=eda,dc=rainchen,dc=com

/projects: design dv custom layout pnr signoff cad sre

用户效果: uid=6001(lws01) gid=6000(cad)
          module load Cadence/IC617 → CADHOME=/tools/cadence
          cd /projects/cad → 可写 ✓

9.5 关键经验(已写入 troubleshoot 第 20 条)

删除旧 OU 的判定应为"子树内是否还有 posixAccount(用户)", 而非"总条目数"——因为 OU 下即使无用户,仍残留空的 posixGroup(首轮因此误跳过)。


来源:/home/rain/Documents/slurm/eda_storage_standardization/LDAP组织结构改造计划.md | 最后更新:2026-09-12 01:47(由 build/sync.py 同步,请勿在站点侧修改)