8.6. プロジェクトの階層
Identity サービス (keystone) のマルチテナンシーを使用して、プロジェクトを入れ子状にできます。マルチテナンシーにより、サブプロジェクトは親プロジェクトのロール割り当てを継承できます。
8.6.1. 階層化されたプロジェクトとサブプロジェクトの作成 リンクのコピーリンクがクリップボードにコピーされました!
階層型マルチテナンシー (HMT) は keystone のドメインとプロジェクトを使用して実装できます。まず最初に新規ドメインを作成して、そのドメイン内にプロジェクトを作成します。これで、そのプロジェクトにサブプロジェクトを追加できるようになります。また、ユーザーをサブプロジェクトの admin ロールに追加すると、そのサブプロジェクトの管理者に昇格できます。
keystone の使用する HMT の構造は、現在 Dashboard では表示されません。
手順
corpという名前の keystone ドメインを新規作成します。コマンドの例
$ openstack domain create corp出力例
+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | | | enabled | True | | id | 6059b0b93b8d4ddb9d31ea47de93f0ab | | name | corp | | options | {} | | tags | [] | +-------------+----------------------------------+corpドメイン内に親プロジェクト (private-cloud) を作成します。コマンドの例
$ openstack project create private-cloud --domain corp出力例
+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | | | domain_id | 6059b0b93b8d4ddb9d31ea47de93f0ab | | enabled | True | | id | e86f182e16e24441b71c7296585c2e21 | | is_domain | False | | name | private-cloud | | options | {} | | parent_id | 6059b0b93b8d4ddb9d31ea47de93f0ab | | tags | [] | +-------------+----------------------------------+private-cloudの親プロジェクト内でcorpドメインも指定して、サブプロジェクト (dev) を作成します。コマンドの例
$ openstack project create dev --parent private-cloud --domain corp出力例
+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | | | domain_id | 6059b0b93b8d4ddb9d31ea47de93f0ab | | enabled | True | | id | 71f05cdd5b8a45d4b1a928bfe7c2e20d | | is_domain | False | | name | dev | | options | {} | | parent_id | e86f182e16e24441b71c7296585c2e21 | | tags | [] | +-------------+----------------------------------+qaという名前のサブプロジェクトをもう 1 つ作成します。コマンドの例
$ openstack project create qa --parent private-cloud --domain corp出力例
+-------------+----------------------------------+ | Field | Value | +-------------+----------------------------------+ | description | | | domain_id | 6059b0b93b8d4ddb9d31ea47de93f0ab | | enabled | True | | id | 03801ad929b84c8fb091bf3248e6db68 | | is_domain | False | | name | qa | | options | {} | | parent_id | e86f182e16e24441b71c7296585c2e21 | | tags | [] | +-------------+----------------------------------+
Identity API を使用してプロジェクトの階層を確認することができます。詳細は、https://developer.openstack.org/api-ref/identity/v3/index.html?expanded=show-project-details-detail を参照してください。
8.6.2. 階層構造のプロジェクトへのアクセスの設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、新規作成したプロジェクトにはロールは割り当てられません。親プロジェクトに対するロールのパーミッションを割り当てるときに、--inherited フラグを指定して、サブプロジェクトが親プロジェクトからパーミッションを継承するように指定できます。たとえば、親プロジェクトに対する admin ロールのアクセス権のあるユーザーには、サブプロジェクトへの admin アクセス権も付与されます。
ユーザーへのアクセス権の付与
プロジェクトに割り当てられている既存のパーミッションを確認します。
$ openstack role assignment list --project private-cloud既存のロールを確認します。
コマンドの例
$ openstack role list出力例
+----------------------------------+-----------------+ | ID | Name | +----------------------------------+-----------------+ | 01d92614cd224a589bdf3b171afc5488 | admin | | 034e4620ed3d45969dfe8992af001514 | member | | 0aa377a807df4149b0a8c69b9560b106 | ResellerAdmin | | cfea5760d9c948e7b362abc1d06e557f | reader | | d5cb454559e44b47aaa8821df4e11af1 | swiftoperator | | ef3d3f510a474d6c860b4098ad658a29 | service | +----------------------------------+-----------------+ユーザーアカウント
user1に、private-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パーミッションの更新の結果を確認します。
コマンドの例
$ 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 は後から作成されたサブプロジェクトにもアクセスできるようになりました。
ユーザーからのアクセス削除
明示的に割り当てられたパーミッションと継承されたパーミッションは別々に削除する必要があります。
明示的に割り当てられたロールからユーザーを削除します。
$ openstack role remove --user user1 --project private-cloud member変更の結果を確認します。継承されたパーミッションがまだ存在している点に注意してください。
コマンドの例
$ openstack role assignment list --effective --user user1 --user-domain corp出力例
+----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+ | Role | User | Group | Project | Domain | Inherited | +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+ | 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be | | 11fccd8369824baa9fc87cf01023fd87 | | True | | 034e4620ed3d45969dfe8992af001514 | 10b5b34df21d485ca044433818d134be | | b4f1d6f59ddf413fa040f062a0234871 | | True | +----------------------------------+----------------------------------+-------+----------------------------------+--------+-----------+継承されたパーミッションを削除します。
$ openstack role remove --user user1 --project private-cloud member --inherited変更の結果を確認します。継承されたパーミッションが削除され、出力が空になりました。
$ openstack role assignment list --effective --user user1 --user-domain corp
8.6.3. Reseller プロジェクトの概要 リンクのコピーリンクがクリップボードにコピーされました!
Reseller プロジェクトでは、複数のドメインを階層化することを目標としています。このようなドメインでは、1 つのサブドメインは、完全に有効化された 1 つのクラウドを表現し、最終的にはクラウドの部分的な再販を考慮することができます。この開発の作業は複数の段階に分かれています。第 1 段階は以下に説明します。
Reseller の第 1 段階
Reseller (第 1 段階) は、階層化されたプロジェクトとサブプロジェクトの作成 に記載されている階層型マルチテナンシー (HMT) の延長です。従来 keystone ドメインは、データベースバックエンド内に独自のテーブルを備えた、ユーザーとプロジェクトを保管するためのコンテナーとすることを目的としていました。その結果、ドメインは独自のテーブルには保管されなくなり、プロジェクトのテーブルにマージされました。
-
ドメインは、ひとつのプロジェクトタイプとなり、
is_domainフラグで区別されます。 - ドメインは、プロジェクト階層の最上位のプロジェクトを表します。ドメインは、プロジェクト階層のルートです。
projectsサブパスを使用してドメインの作成と取得を行うように API が更新されました。-
新規ドメインを作成するには、
is_domainフラグを true に指定してプロジェクトを作成します。 -
ドメインであるプロジェクトをリスト表示します。
is_domainクエリーパラメーターを含むプロジェクトを取得します。
-
新規ドメインを作成するには、