中文 | English
PVE 集群侧脚本:创建最小自定义角色、为用户供给配额资源池与 ACL、验证 P0 退出标准。这些脚本只做「准备与约束」——配额的强制执行由 ProxmoxUserQuota-Proxy 完成(P4 起)。所有脚本幂等,可反复运行(也用作 LDAP 同步后的对账器)。
每个特权取舍的设计依据见 ProxmoxUserQuota-Docs / pool-rbac.md。
| 脚本 | 运行位置 / 身份 | 用途 |
|---|---|---|
scripts/00-create-roles.sh |
任一集群节点,root | 创建/刷新角色 UQ-VMUser、UQ-Storage、UQ-Net、UQ-ProxyAudit |
scripts/10-provision-user.sh |
任一集群节点,root | 为单个用户创建池 uq-<user> 并配置 ACL |
scripts/30-provision-proxy.sh |
任一集群节点,root | 创建代理服务账号 uq-proxy@pve + API token + ACL,并写出 token 文件给代理 |
scripts/40-provision-storage.sh |
拥有 zpool 的节点,root | (P6 防御纵深)为用户创建带 zfs quota 的专属数据集 + 独立 zfspool 存储 + ACL |
scripts/50-verify-idp.sh |
每个 cloud 节点,root | (只读预检)校验跨集群 IdP:CA 信任、LDAPS/Keycloak 连通与发现、Keycloak redirect URI、PVE realm 设置 |
scripts/60-reconcile.sh |
能到 pveum + 代理 /usage 的节点,root |
(只读审计)漂移告警:超额 / 孤儿池 / 缺 ACL / 缺池;配 deploy/uq-reconcile.timer 定时跑 |
scripts/20-verify-p0.sh |
任何有 curl + python3 的机器 |
通过 API 断言 P0 退出标准 |
./scripts/00-create-roles.sh
./scripts/30-provision-proxy.sh -f /etc/uq-proxy/pve-token # 代理服务账号 + token
# 每个用户:建池/ACL,再(可选)建带硬配额的专属 ZFS 存储
./scripts/10-provision-user.sh alice@ldap -b vmbr0
./scripts/40-provision-storage.sh alice@ldap -q 200 # 数据集 pool/uq-alice,硬 quota 200G
./scripts/20-verify-p0.sh https://node1:8006 testuser1@pve 'pw1' testuser2@pve 'pw2' node1
30-provision-proxy.sh 写出的 token 文件供代理的 -pve-token-file 使用;若代理与集群不在同一主机,把该文件拷到代理主机后重启 uq-proxy。重新生成密钥用 --rotate。
40-provision-storage.sh 是存储层硬兜底:即使绕过代理,ZFS 也会拒绝超出 quota 的分配。用它时把 UQ-Storage 只授予用户的专属存储(不要再授共享存储),并在 quotas.yaml 里写对应的软上限 disk-gib: { uq-<user>: <GiB> }。每个用户记得把配额记录加进代理的 quotas.yaml(无记录的用户在 -enforce 下默认拒绝)。
双集群(用户 cloud + 我们的 syscom)场景:LDAP/Keycloak 在 syscom,代理只在 cloud。代理对认证完全透明(只做转发 + X-Forwarded-*),认证是 cloud 节点 ↔ syscom IdP。上真实 IdP 用户前,在每个 cloud 节点跑 50-verify-idp.sh 预检:
# 先看 CA 安装 + realm 配置模板
./scripts/50-verify-idp.sh --print-setup
# 再校验连通/信任/redirect/realm(按实际填)
./scripts/50-verify-idp.sh --proxy-url https://pve.example.com:8007 \
--oidc-issuer https://kc.syscom/realms/cloud \
--ldap-host ldap.syscom --ca /root/syscom-ca.pem --realm cloud
通过后,IdP 用户的供给与本地 realm 用户完全一致(10 + 40 + quotas.yaml),只是 realm 不同。设计依据见 Docs / topology.md 的 OIDC Through the Proxy 与 Availability Coupling。
60-reconcile.sh 是只读对账审计:以代理 /usage(配额记录权威来源)对照真机的池与 ACL,告警四类漂移——超额、孤儿池(uq-* 池有客户机却无配额记录)、缺 ACL(有记录但 UQ-VMUser ACL 被 LDAP 同步清掉)、缺池。有发现就退出非零并写 syslog(uq-reconcile),适合 cron / 监控。定时跑:
cp scripts/60-reconcile.sh /usr/local/sbin/uq-reconcile.sh
cp deploy/uq-reconcile.{service,timer} /etc/systemd/system/
systemctl daemon-reload && systemctl enable --now uq-reconcile.timer
# 或 cron:@hourly /usr/local/sbin/uq-reconcile.sh --quiet (配 MAILTO)
要求:PVE 8.x / 9.x。20-verify-p0.sh 接受自签名 TLS(curl -k),仅限测试集群使用。