6.2. プロジェクトの階層
6.2.1. Identity サービスの階層型マルチテナンシー (HMT)
Identity サービス (keystone) のマルチテナンシーを使用して、プロジェクトを入れ子状にすることができます。マルチテナンシーにより、サブプロジェクトは親プロジェクトのロール割り当てを継承することができます。
6.2.1.1. プロジェクトとサブプロジェクトの作成
階層型マルチテナンシー (HMT) は keystone のドメインとプロジェクトを使用して実装することができます。まず最初に新規ドメインを作成して、そのドメイン内にプロジェクトを作成します。これで、そのプロジェクトにサブプロジェクトを追加できるようになります。また、ユーザーをサブプロジェクトの admin
ロールに追加すると、そのサブプロジェクトの管理者に昇格できます。
keystone の使用する HMT の構造は、現在 Dashboard では表示されません。
1.corp
という名前の keystone ドメインを新規作成します。
openstack domain create corp
$ openstack domain create corp
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | |
| enabled | True |
| id | 69436408fdcb44ab9e111691f8e9216d |
| name | corp |
+-------------+----------------------------------+
2.corp
ドメイン内に親プロジェクト (private-cloud
) を作成します。
openstack project create private-cloud --domain corp
$ 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
の親プロジェクト内で corp
ドメインも指定して、サブプロジェクト (dev
) を作成します。
openstack project create dev --parent private-cloud --domain 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
という名前のサブプロジェクトをもう 1 つ作成します。
openstack project create qa --parent private-cloud --domain corp
$ 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
$ openstack role assignment list --project private-cloud
2.既存のロールを確認します。
openstack role list
$ openstack role list
+----------------------------------+-----------------+
| ID | Name |
+----------------------------------+-----------------+
| 01d92614cd224a589bdf3b171afc5488 | admin |
| 034e4620ed3d45969dfe8992af001514 | member |
| 0aa377a807df4149b0a8c69b9560b106 | ResellerAdmin |
| 9369f2bf754443f199c6d6b96479b1fa | heat_stack_user |
| cfea5760d9c948e7b362abc1d06e557f | reader |
| d5cb454559e44b47aaa8821df4e11af1 | swiftoperator |
| ef3d3f510a474d6c860b4098ad658a29 | service |
+----------------------------------+-----------------+
3.ユーザーアカウント user1
に、private-cloud
プロジェクトに対するアクセス権を付与します。
openstack role add --user user1 --user-domain corp --project private-cloud member
$ 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
$ openstack role add --user user1 --user-domain corp --project private-cloud member --inherited
4.パーミッションの更新の結果を確認します。
openstack role assignment list --effective --user user1 --user-domain corp
$ 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
ユーザーは、qa
プロジェクトと dev
プロジェクトへのアクセス権を継承しています。さらに、--inherited
フラグが親プロジェクトに適用されたため、user1
は後から作成されたサブプロジェクトにもアクセスできるようになりました。
6.2.2. アクセス権の削除
明示的に割り当てられたパーミッションと継承されたパーミッションは別々に削除する必要があります。
1.明示的に割り当てられたロールからユーザーを削除します。
openstack role remove --user user1 --project private-cloud member
$ openstack role remove --user user1 --project private-cloud member
2.変更の結果を確認します。継承されたパーミッションがまだ存在している点に注意してください。
openstack role assignment list --effective --user user1 --user-domain corp
$ 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
$ openstack role remove --user user1 --project private-cloud member --inherited
4.変更の結果を確認します。継承されたパーミッションが削除され、出力が空になりました。
openstack role assignment list --effective --user user1 --user-domain corp
$ openstack role assignment list --effective --user user1 --user-domain corp
6.2.3. ネスティングされたクォータ
現時点では、ネスティングされたクォータ はまだサポートされていません。そのため、クォータはプロジェクトとサブプロジェクトで別々に管理する必要があります。
6.2.4. Reseller の概要
Reseller プロジェクトでは、複数のドメインを階層化することを目標としています。このようなドメインでは、1 つのサブドメインは、完全に有効化された 1 つのクラウドを表現し、最終的にはクラウドの部分的な再販を考慮することができます。この開発の作業は複数の段階に分かれています。第 1 段階については以下に説明します。
6.2.4.1. Reseller の第 1 段階
Reseller (第 1 段階) は、「Identity サービスの階層型マルチテナンシー (HMT)」に記載の階層型マルチテナンシー (HMT) の延長です。従来 keystone ドメインは、データベースバックエンド内に独自のテーブルを備えた、ユーザーとプロジェクトを保管するためのコンテナーとすることを目的としていました。その結果、ドメインは独自のテーブルには保管されなくなり、プロジェクトのテーブルにマージされました。
-
ドメインは、ひとつのプロジェクトタイプとなり、
is_domain
フラグで区別されます。 - ドメインは、プロジェクト階層の最上位のプロジェクトを表します。ドメインは、プロジェクト階層のルートです。
projects
サブパスを使用してドメインの作成と取得を行うように API が更新されました。-
新規ドメインを作成するには、
is_domain
フラグを true に指定してプロジェクトを作成します。 -
ドメインであるプロジェクトをリスト表示します。
is_domain
クエリーパラメーターを含むプロジェクトを取得します。
-
新規ドメインを作成するには、
~