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属主清单
四、实施步骤(顺序关键)¶
- 备份
bash # LDAP 全量导出(演示) kubectl exec -n server openldap-0 -- sh -c 'slapcat' > ldap_backup.ldif # 目录属主清单 ls -ln /home /data/eda/projects > dir_owners_backup.txt - 创建新 OU:
ou=eda→frontend/analog/backend/it - 创建职能组:
design/dv/custom/layout/pnr/signoff/cad/sre(posixGroup + gidNumber) - 迁移用户:
modrdn把用户从旧cn移到新cn(newsuperior),GID 不变 - 删除旧部门:
ou=dev/ops/IT(脚本会先校验子树为空才删) /projects改名:teama→design、teama1→dv、teamb→custom、teamb1→layout、teamc→cad、teamc1→sre(仅改名,GID 不变)- Slurm 账户重同步(执行阶段需手工确认)
bash # 重跑同步脚本(演示) bash /data/slurm/tools/slurm_ldap_sync.sh # 清理旧账户(演示,需确认无活跃作业) sacctmgr -i delete account teama,teama1,teamb,teamb1,teamc,teamc1 - 清客户端缓存:
sss_cache -u <user>(脚本自动执行) - 验证(见第六节)
五、风险与影响¶
| # | 影响面 | 变化 | 风险 | 缓解 |
|---|---|---|---|---|
| 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 # 预演,不修改系统
八、待确认¶
- 职能映射是否符合预期(teama→design 等)?可按实际岗位调整
- 是否需要项目组维度(如
cn=proj_alpha)与职能组并存? - 执行时机:确认在无作业窗口执行
九、执行结果(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同步,请勿在站点侧修改)