Keystone v3里的group和domain

keystone v2.0里tenant通常是我们操作和设置的目标,甚至可以说之前版本的openstack是tenant为最基础的单元,管理起来也是每个tenant进行单独管理,同理用户角色也是一样,据此新版keystone v3新增加了一些概念

首先看下CLI的结果,这里就不查API了,对于HTTP RESTful的请求,body里面有些未知参数,直接从CLI下手

[lihui@openstack ~]$ openstack token issue
+------------+----------------------------------+
| Field      | Value                            |
+------------+----------------------------------+
| expires    | 2017-04-09T16:15:50+0000         |
| id         | 0e806c34f03b40e387f241910d6344ac |
| project_id | f9421976c24343c8b3d9e0a06d40c902 |
| user_id    | 88ada3e09d2a4ccf9b9ce6686d8e57f9 |
+------------+----------------------------------+

发现这里有一个变化,以前是tenant_id,这里出现的是project_id,其实就是改了个名字而已

这不是重点,继续看下project和user的详情

首先是project,出现了domain信息,以及一个parent_id

[lihui@openstack ~]$ openstack project show f9421976c24343c8b3d9e0a06d40c902
+-------------+-----------------------------------------------+
| Field       | Value                                         |
+-------------+-----------------------------------------------+
| description | Bootstrap project for initializing the cloud. |
| domain_id   | default                                       |
| enabled     | True                                          |
| id          | f9421976c24343c8b3d9e0a06d40c902              |
| is_domain   | False                                         |
| name        | admin                                         |
| parent_id   | default                                       |
+-------------+-----------------------------------------------+

然后是user,也出现了domain信息

[lihui@openstack ~]$ openstack user show 88ada3e09d2a4ccf9b9ce6686d8e57f9
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 88ada3e09d2a4ccf9b9ce6686d8e57f9 |
| name                | admin                            |
| options             | {}                               |
| password_expires_at | None                             |
+---------------------+----------------------------------+

从这两点可以看出一些端倪,回忆v2.0版本,创建user的时候必须要指定一个tenant id,user-get的表里也必须会关联tenant信息,因此看看这里创建user和project的选项参数

[lihui@openstack ~]$ openstack user create
usage: openstack user create [-h] [-f {json,shell,table,value,yaml}]
                             [-c COLUMN] [--max-width ]
                             [--print-empty] [--noindent] [--prefix PREFIX]
                             [--domain <domain>] [--project <project>]
                             [--project-domain <project-domain>]
                             [--password ] [--password-prompt]
                             [--email ]
                             [--description ]
                             [--enable | --disable] [--or-show]
                             
openstack user create: error: too few arguments

其它的不用看了,可以传入已经存在的domain和project

[lihui@openstack ~]$ openstack project create
usage: openstack project create [-h] [-f {json,shell,table,value,yaml}]
                                [-c COLUMN] [--max-width ]
                                [--print-empty] [--noindent] [--prefix PREFIX]
                                [--domain ] [--parent ]
                                [--description ]
                                [--enable | --disable]
                                [--property ] [--or-show]
                                
openstack project create: error: too few arguments

同样,创建project也可以传入已经存在的domain

根据上面两点就隐隐约约能够猜到domain应该是在user和project外面更庞大的一个概念,他们都属于domain

看下domain信息

[lihui@openstack ~]$ openstack domain show default
+-------------+--------------------+
| Field       | Value              |
+-------------+--------------------+
| description | The default domain |
| enabled     | True               |
| id          | default            |
| name        | Default            |
+-------------+--------------------+

一个描述一个name,还有一个开关,可见创建domain只不需要其它依赖的,可见这应该是一个比较“大”的单位

说到这里,来看下新版v3里的概念

user:使用资源服务的用户

project:对应以前的tenant,资源的集合

domain:许多project和许多user一起组成的集合,既然是集合,name不可重复,但不同的domain之间相互隔离,之间的元素name可以重复,可以参考network namespace里的私有网IP地址

group:domain里一些user的集合,假如给一个group设置一个role,那么group里的所有user都分配了这个role

通过网上这个图来描述比较准确

看这个场景之前,先看看添加role

[lihui@openstack ~]$ openstack help role add
usage: openstack role add [-h] [--domain  | --project ]
                          [--user  | --group ]
                          [--group-domain ]
                          [--project-domain ]
                          [--user-domain ] [--inherited]
                          [--role-domain ]
                          

Adds a role assignment to a user or group on a domain or project

可以看到可以添加role的有user,group

再看看之前v2.0版本

lihui@devstack:~/devstack$ keystone help | grep user-role-add
    user-role-add       Add role to user

只能给user添加role

再回到上面这个图:

Domain1中包含 3 个Project,Project1~3;1个Group,Group1

Project3中包括1个Group,Group2

通过Group1将Role Sysadmin设置给Domain1,那么Group1中的所有用户将会对Domain中的所有Projects都拥有管理员权限。也可以通过Group2将Role Engineer设置给Project3,这样Group2中的User2就只拥有对Project3相应的权限,而不会影响其它Project

发表回复