6.2. 项目层次结构

6.2.1. Identity Service 中的分层多租户(HMT)

您可以使用 Identity 服务(keystone)中的多租户来嵌套项目。多租户允许子项目从父项目继承角色分配。

6.2.1.1. 创建项目和子项目

您可以使用 keystone 域和项目实施层次结构多租户(HMT)。首先创建一个新域,然后在该域内创建项目。然后,您可以向该项目添加子项目。您还可以通过将用户添加到该子项目的 admin 角色,将用户提升到子项目的管理员。

注意

keystone 使用的 HMT 结构目前没有在仪表板中表示。

1.创建名为 corp 的新 keystone 域:

$ openstack domain create corp
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| enabled     | True                             |
| id          | 69436408fdcb44ab9e111691f8e9216d |
| name        | corp                             |
+-------------+----------------------------------+

2.corp 域中创建父项目(private-cloud):

$ openstack project create private-cloud --domain corp
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 69436408fdcb44ab9e111691f8e9216d |
| enabled     | True                             |
| id          | c50d5cf4fe2e4929b98af5abdec3fd64 |
| is_domain   | False                            |
| name        | private-cloud                    |
| parent_id   | 69436408fdcb44ab9e111691f8e9216d |
+-------------+----------------------------------+

3.private-cloud 父项目中创建子项目(dev),同时指定 corp 域:

$ openstack project create dev --parent private-cloud --domain corp
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 69436408fdcb44ab9e111691f8e9216d |
| enabled     | True                             |
| id          | 11fccd8369824baa9fc87cf01023fd87 |
| is_domain   | False                            |
| name        | dev                              |
| parent_id   | c50d5cf4fe2e4929b98af5abdec3fd64 |
+-------------+----------------------------------+

4.创建名为 qa 的另一个子项目:

$ openstack project create qa --parent private-cloud --domain corp
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description |                                  |
| domain_id   | 69436408fdcb44ab9e111691f8e9216d |
| enabled     | True                             |
| id          | b4f1d6f59ddf413fa040f062a0234871 |
| is_domain   | False                            |
| name        | qa                               |
| parent_id   | c50d5cf4fe2e4929b98af5abdec3fd64 |
+-------------+----------------------------------+
注意

您可以使用 Identity API 查看项目层次结构。如需更多信息,请参阅 https://developer.openstack.org/api-ref/identity/v3/index.html?expanded=show-project-details-detail

6.2.1.2. 授予用户访问权限

默认情况下,新创建的项目没有分配的角色。为父项目分配角色权限时,您可以包含 --inherited 标志,以指示子项目从父项目中继承分配的权限。例如,具有对父项目的 admin 角色的用户也具有对子项目的 admin 访问权限。

1.查看分配给项目的现有权限:

$ openstack role assignment list --project private-cloud

2.查看现有角色:

$ openstack role list
+----------------------------------+-----------------+
| ID                               | Name            |
+----------------------------------+-----------------+
| 01d92614cd224a589bdf3b171afc5488 | admin           |
| 034e4620ed3d45969dfe8992af001514 | member          |
| 0aa377a807df4149b0a8c69b9560b106 | ResellerAdmin   |
| 9369f2bf754443f199c6d6b96479b1fa | heat_stack_user |
| cfea5760d9c948e7b362abc1d06e557f | reader          |
| d5cb454559e44b47aaa8821df4e11af1 | swiftoperator   |
| ef3d3f510a474d6c860b4098ad658a29 | service         |
+----------------------------------+-----------------+

3.授予用户帐户 user1private-cloud 项目的访问权限:

$ openstack role add --user user1 --user-domain corp --project private-cloud member

使用 --inherited 标志重新运行此命令。因此,user1 还可以访问 private-cloud 子项目,它已继承了角色分配:

$ openstack role add --user user1 --user-domain corp --project private-cloud member --inherited

4.查看权限更新的结果:

$ openstack role assignment list --effective --user user1 --user-domain corp
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| Role                             | User                             | Group | Project                          | Domain | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be |       | c50d5cf4fe2e4929b98af5abdec3fd64 |        | False     |
| 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be |       | 11fccd8369824baa9fc87cf01023fd87 |        | True      |
| 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be |       | b4f1d6f59ddf413fa040f062a0234871 |        | True      |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+

user1 用户已继承了对 qadev 项目的访问权限。此外,由于 --inherited 标志应用到父项目,user1 也接受对稍后创建的任何子项目的访问。

6.2.2. 删除访问权限

必须单独删除显式和继承的权限。

1.从显式分配的角色中删除用户:

$ openstack role remove --user user1 --project private-cloud member

2.查看更改的结果。请注意,继承的权限仍然存在:

$ openstack role assignment list --effective --user user1 --user-domain corp
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| Role                             | User                             | Group | Project                          | Domain | Inherited |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+
| 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be |       | 11fccd8369824baa9fc87cf01023fd87 |        | True      |
| 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be |       | b4f1d6f59ddf413fa040f062a0234871 |        | True      |
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+

3.删除继承的权限:

$ openstack role remove --user user1 --project private-cloud member --inherited

4.查看更改的结果。继承的权限已被删除,生成的输出现在为空:

$ openstack role assignment list --effective --user user1 --user-domain corp

6.2.3. 嵌套配额

目前,尚不支持 嵌套配额。因此,您必须针对项目和子项目单独管理配额。

6.2.4. 法国概述

使用 Reseller 项目时,目标是具有域层次结构;这些域最终允许您考虑删除部分云,子域代表一个功能齐全的云。这个工作分为几个阶段,如下所示:

6.2.4.1. 1 阶段

法国(第 1 阶段)是层次结构多租户(HMT)的扩展,如下所述: 第 6.2.1 节 “Identity Service 中的分层多租户(HMT)”。在以前的版本中,keystone 域最初打算是存储用户和项目的容器,在数据库后端中都有自己的表。现在,域不再存储在自己的表中,并已合并到项目表中:

  • 域现在是一个项目,由 is_domain 标志区分。
  • 域表示项目层次结构中的顶级项目:域是项目层次结构中的根
  • API 已更新,以使用 项目 子路径来创建和检索域:

    • 通过创建项目并将 is_domain 标志设置为 true 来创建新域
    • 列出属于 domain 的项目:获取项目,包括 is_domain 查询参数。

~