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