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
