分享

Keystone总结:openstack中Keystone各种概念解析及其两种安装方式总结

pig2 发表于 2014-3-1 01:49:42 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 10 68570
本帖最后由 nettman 于 2014-3-1 10:16 编辑

可以带着下面问题来阅读:
1./etc/keystone/keystone.conf文件的作用是什么?
2.connection = mysql://keystonedbadmin:keystonesecret@10.10.10.2/keystone包含的元素都是什么?
3.重启keystone的命令是什么?
4.那些环境变量是OpenStack必须运行的?
5.比较软件安装与源码安装的区别

---------------------------------------------------------------------------

一、对keystone一些概念认识

那什么叫做 User ,Tenant 呢?这里我举个比较好理解的例子。我们去宾馆住的时候,我们自己就相当于 User ,而宾馆就是 Tenant 。这是最简单的情况,宾馆值提供房间,我们只需要住房。

    随着后来生活物质等的提高,这种现象就变了。我们去宾馆住的时候,很多东西都不一样,比如,开房间要身份证,房间的钥匙是一个可以当卡刷的牌子,我们进出宾馆的时候需要用自己的钥匙来开启宾馆的大门;还有就是,宾馆不仅仅是用来住的了,它可以给我们提供饮食,娱乐,健身等各种服务;而且服务层次的不同,房间也不同,房间里面的配置豪华程度也不一样。在这种情况下,描述我们和宾馆之间的关系就复杂一些了,这就引发了一些新的概念。

  举完这个例子, keystone 中的各种概念就可以和例子中的事物相挂钩了。

User住宾馆的人
Credentials开启房间的钥匙
Authentication宾馆为了拒绝不必要的人进出宾馆,专门设置的机制,只有拥有钥匙的人才能进出
Token也是一种钥匙,有点特别
Tenant宾馆
Service宾馆可以提供的服务类别,比如,饮食类,娱乐类
Endpoint具体的一种服务,比如吃烧烤,打羽毛球
RoleVIP 等级,VIP越高,享有越高的权限



----------------------------------------------------------------------------------------------------------------------------------------------------


Keystone的安装方式有两种:
1.下载软件安装
2.源码安装

二、软件安装


下载软件安装我们这个比较明白,那么源码安装,我们可能比较迷惑,

Keystone是OpenStack的认证服务。

使用以下命令进行安装:

sudo apt-get install keystone python-keystone python-keystoneclient

打开/etc/keystone/keystone.conf文件,将这一行:

admin_token = ADMIN

改为:

admin_token = admin

(本教程中我们将一直使用admin作为令牌)



本例中,我们使用MySQL来存储keystone配置,则将 /etc/keystone/keystone.conf中的这句配置:

connection = sqlite:////var/lib/keystone/keystone.db

换成:

connection = mysql://keystonedbadmin:keystonesecret@10.10.10.2/keystone





然后,重启Keystone:

sudo service keystone restart





接着,执行以下命令同步数据库:

sudo keystone-manage db_sync





最后,有些环境变量是OpenStack运行所必须的:

export SERVICE_ENDPOINT="http://localhost:35357/v2.0"

export SERVICE_TOKEN=admin

当然为了避免下次系统重启后,还得将这些变量再次export,最稳妥的办法就是将其写入~/.bashrc中。





创建租间

使用以下命令创建两个租间,admin和service:

keystone tenant-create --name admin

keystone tenant-create --name service


创建用户

执行以下命令,创建四个用户admin、nova、glance及swift:

keystone user-create --name admin --pass admin --email admin@foobar.com

keystone user-create --name nova --pass nova --email nova@foobar.com

keystone user-create --name glance --pass glance --email glance@foobar.com

keystone user-create --name swift --pass swift --email swift@foobar.com



创建角色

使用命令创建两个角色,admin和Member(译者注:注意是大写M):

keystone role-create --name admin

keystone role-create --name Member


查看租间、用户和角色

刚才建立的租间、用户和角色可以通过如下命令进行查看:

租间列表:

keystone tenant-list

+----------------------------------+--------------------+---------+

| id | name | enabled |

+----------------------------------+--------------------+---------+

| 7f95ae9617cd496888bc412efdceabfd | admin | True |

| c7970080576646c6959ee35970cf3199 | service | True |

+----------------------------------+--------------------+---------+



用户列表:

keystone user-list

+----------------------------------+---------+-------------------+--------+

| id | enabled | email | name |

+----------------------------------+---------+-------------------+--------+

| 1b986cca67e242f38cd6aa4bdec587ca | True | swift@foobar.com | swift |

| 518b51ea133c4facadae42c328d6b77b | True | glance@foobar.com | glance |

| b3de3aeec2544f0f90b9cbfe8b8b7acd | True | admin@foobar.com | admin |

| ce8cd56ca8824f5d845ba6ed015e9494 | True | nova@foobar.com | nova |

+----------------------------------+---------+-------------------+--------+



角色列表:

keystone role-list

+----------------------------------+----------------------+

| id | name |

+----------------------------------+----------------------+

| 2bbe305ad531434991d4281aaaebb700 | admin |

| d983800dd6d54ee3a1b1eb9f2ae3291f | Member |

+----------------------------------+----------------------+



请大家格外注意id列中的值,虽然很长,但随后为用户绑定角色,继而把用户配入租间中时可全靠它们了。





为特定租间中的用户绑定角色

现在我们先为刚刚创建的用户绑定角色,通过如下命令格式可以将特定租间中的特定用户增加角色(译者注:仅是命令格式,随后才是真正执行的命令):

keystone user-role-add --user $USER_ID --role $ROLE_ID --tenant_id $TENANT_ID

其中id字段可以通过keystone user-list,keystone role-list和keystone tenant-list命令获得。




下面开始为“admin”租间中的“admin”用户绑定“admin”角色:

keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role 2bbe305ad531434991d4281aaaebb700 --tenant_id 7f95ae9617cd496888bc412efdceabfd




接着执行如下命令,为“service”租间中的“nova”、“glance”、“swift”用户绑定“admin”角色:

keystone user-role-add --user ce8cd56ca8824f5d845ba6ed015e9494 --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199

keystone user-role-add --user 518b51ea133c4facadae42c328d6b77b --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199

keystone user-role-add --user 1b986cca67e242f38cd6aa4bdec587ca --role 2bbe305ad531434991d4281aaaebb700 --tenant_id c7970080576646c6959ee35970cf3199





Horizon和Swift只“Member”角色即可,所以相应地执行如下命令:

keystone user-role-add --user b3de3aeec2544f0f90b9cbfe8b8b7acd --role d983800dd6d54ee3a1b1eb9f2ae3291f --tenant_id 7f95ae9617cd496888bc412efdceabfd



注意,在执行自己的安装时,请千万按照实际安装中的id进行设置,照抄本文id必将出错!


创建服务

至此,我们该创建授权用户可以享用的服务了,命令格式如下:

keystone service-create --name service_name --type service_type --description 'Description of the service'



安装上述格式,创建nova-compute、nova-volume、glance、swift、keystone及ec2服务:

keystone service-create --name nova --type compute --description 'OpenStack Compute Service'

keystone service-create --name volume --type volume --description 'OpenStack Volume Service'

keystone service-create --name glance --type image --description 'OpenStack Image Service'

keystone service-create --name swift --type object-store --description 'OpenStack Storage Service'

keystone service-create --name keystone --type identity --description 'OpenStack Identity Service'

keystone service-create --name ec2 --type ec2 --description 'EC2 Service'





刚才创建的每个服务都拥有唯一的id,要查看服务id,使用如下命令即可:

keystone service-list

+----------------------------------+----------+--------------+----------------------------+

| id | name | type | description |

+----------------------------------+----------+--------------+----------------------------+

| 1e93ee6c70f8468c88a5cb1b106753f3 | nova | compute | OpenStack Compute Service |

| 28fd92ffe3824004996a3e04e059d875 | ec2 | ec2 | EC2 Service |

| 7d4ec192dfa1456996f0f4c47415c7a7 | keystone | identity | OpenStack Identity Service |

| 96f35e1112b143e59d5cd5d0e6a8b22d | swift | object-store | OpenStack Storage Service |

| f38f4564ff7b4e43a52b2f5c1b75e5fa | volume | volume | OpenStack Volume Service |

| fbafab6edcab467bb734380ce6be3561 | glance | image | OpenStack Image Service |

+----------------------------------+----------+--------------+----------------------------+

这些id将被用于定义所属服务的入口(endpoint)。





创建入口

创建服务入口的命令格式是:

keystone endpoint-create --region region_name --service_id service_id --publicurl public_url --adminurl admin_url --internalurl internal_url





使用如下命令创建nova-compute入口:

keystone endpoint-create --region myregion --service_id 1e93ee6c70f8468c88a5cb1b106753f3 --publicurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --adminurl 'http://10.10.10.2:8774/v2/$(tenant_id)s' --internalurl 'http://10.10.10.2:8774/v2/$(tenant_id)s'

使用如下命令创建nova-volume入口:

keystone endpoint-create --region myregion --service_id f38f4564ff7b4e43a52b2f5c1b75e5fa --publicurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --adminurl 'http://10.10.10.2:8776/v1/$(tenant_id)s' --internalurl 'http://10.10.10.2:8776/v1/$(tenant_id)s'

使用如下命令创建glance入口:

keystone endpoint-create --region myregion --service_id fbafab6edcab467bb734380ce6be3561 --publicurl 'http://10.10.10.2:9292/v1' --adminurl 'http://10.10.10.2:9292/v1' --internalurl 'http://10.10.10.2:9292/v1'



使用如下命令创建swift入口:

keystone endpoint-create --region myregion --service_id 96f35e1112b143e59d5cd5d0e6a8b22d --publicurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s' --adminurl 'http://10.10.10.2:8080/v1' --internalurl 'http://10.10.10.2:8080/v1/AUTH_$(tenant_id)s'

使用如下命令创建keystone入口:

keystone endpoint-create --region myregion --service_id 7d4ec192dfa1456996f0f4c47415c7a7 --publicurl http://10.10.10.2:5000/v2.0 --adminurl http://10.10.10.2:35357/v2.0 --internalurl http://10.10.10.2:5000/v2.0

使用如下命令创建ec2入口:

keystone endpoint-create --region myregion --service_id 28fd92ffe3824004996a3e04e059d875 --publicurl http://10.10.10.2:8773/services/Cloud --adminurl http://10.10.10.2:8773/services/Admin --internalurl http://10.10.10.2:8773/services/Cloud


----------------------------------------------------------------------------------------------------------------------------------------------------

三、源码安装

Keystone是Openstack框架中,负责身份验证、服务规则和服务令牌的功能, 它实现了Openstack的Identity API, 本文将向你介绍, 如何安装配置Keystone, 并且在安装的过程中, 有哪些问题需要注意的。

Keystone类似一个服务总线, 或者说是整个Openstack框架的注册表, 其他服务通过keystone来注册其服务的Endpoint, 任何服务之间相互的调用, 需要经过Keystone的身份验证, 来获得目标服务的Endpoint来找到目标服务。 虽然Keystone所扮演的角色很好很强大,但是我个人认为, Keystone相对其他服务的安装和配置来说, 还是相对比较简单的。

准备环境

os: ubuntu server 11.10
hostname: ps-keystone-01
ip address: 10.172.7.81     
netmask: 255.255.255.0
gateway: 10.172.7.1

安装Keystone

如果你使用的是ubuntu, 可以直接通过apt-get来获得keystone, 不过本文所说的是从Keystone的git来获得最新的代码来安装。

keystone的安装环境
首先需要安装一些必要的工具.确保你的机器可以访问互联网

sudo apt-get install build-essential git python-dev python-setuptools python-pip libxml2-dev libxslt-dev
我们把数据库也部署在这台机器上:

sudo apt-get install mysql-server mysql-client python-mysqldb
设置好mysql的root密码, 然后创建keystone的数据库

mysql -u root -p
create database keystone;
grant all on keystone.* to 'keystone'@'%' identified by 'openstack';  补充说明:向数据库中添加一个用户(keystone),密码为openstack

quit

获得keystone的代码

安装keystone service

cd ~
git clone git://github.com/openstack/keystone.git
安装keystone client, 很多人通过git签出的代码来安装, 都漏掉了这步。 如果你不安装这个, 你后面将没办法通过客户端的命令来验证安装的keystone服务。

cd ~
git clone git://github.com/openstack/python-keystoneclient.git client
安装keystone的依赖项,并将keystone安装到python的package里
cd ~/keystone
sudo pip install -r tools/pip-requires  注明:H版本没有这个文件了,可以跳过这一步
sudo python setup.py install            建议使用:sudo pip install -e .
这个过程需要等待一段时间, 接下来把keystone client的依赖项也装好

cd ~/client
sudo pip install -r tools/pip-requires  注明:H版本没有这个文件了,可以跳过这一步


sudo python setup.py install            建议使用:sudo pip install -e .

配置keystone

由于是从git签出的代码, 所以, 我们需要自己创建keystone的配置文件路径和文件, 不过好在刚才签出的代码中有conf文件的examples, 所以我们可以直接拷贝到etc/keystone文件夹里去。

sudo mkdir -p /etc/keystone
sudo cp ~/keystone/etc/* /etc/keystone/
修改配置文件 /etc/keystone/keystone.conf, 将

[sql]
connection = sqlite:///keystone.db
修改为

[sql]
connection = mysql://keystone:openstack@localhost/keystone   这就是上面创建的user(keystone)和密码openstack
然后将
[catalog]
driver = keystone.catalog.backends.templated.TemplatedCatalog
template_file = ./etc/default_catalog.templates
修改为
[catalog]
driver = keystone.catalog.backends.sql.Catalog

记住keystone.conf里的admin\_token, 这个是keystone默认配置的admin\_token, 我们需要用到它来访问keystone的服务, 后面也可以通过keystone-client来注册新的token。 默认的admin_token是ADMIN, 我们把它添加到系统环境里去

export SERVICE_TOKEN=ADMIN       注明:也可以在keystone.cof文件中添加admin_token = ADMIN 表示一个默认的token

export SERVICE_ENDPOINT=http://10.172.7.81:35357/v2.0

同步数据库schema并运行keystone

sudo keystone-manage db_sync   注明:同步数据库、并创建keystone表
sudo keystone-all -d &

至此, keystone服务就安装完毕, 并且运行了, 我们只是为了验证keystone的安装, 还没有对部署进一步完善, 例如开机自动启动keystone服务, 这个后面会说明, 下面我们需要验证我们安装的keystone是否可用。

验证keystone的安装

我们先执行一下

keystone user-list
执行的结果应该是

+----+---------+-------+------+
| id | enabled | email | name |
+----+---------+-------+------+
+----+---------+-------+------+
因为我们还没有添加任何user, role, service还有endpoint, 但是这里已经证明keystone service在工作了。 我们只需要按照自己的要求来添加服务的定义, 服务的endpoint, 添加tenant, user和role就可以了。 或者, 我们使用~/keystone/tools/sample_data.sh里定义的默认的schema和实例数据作为参考数据。 不过我们这次为了理解keystone里每个对象的用途, 还是手动的来配置数据。


keystone命令实例


我们添加默认的租户 adminTenant

#创建租户(tenant)
keystone tenant-create --name adminTenant --description "Admin Tenant" --enabled true
执行的结果是:

+-------------+----------------------------------+
|   Property  |              Value               |
+-------------+----------------------------------+
| description | Admin Tenant                     |
| enabled     | True                             |
| id          | 95d5f489c33c44acaed3f4f04aca1c02 |
| name        | adminTenant                      |
+-------------+----------------------------------+
记住上面的id, 下面添加admin账号的时候会用到

#创建admin账号 (user)
keystone user-create --tenant_id 95d5f489c33c44acaed3f4f04aca1c02 --name admin --pass openstack --enabled true
执行结果:

+----------+-------------------------------------------------------------------------------------------------------------------------+
| Property |                                                          Value                                                          |
+----------+-------------------------------------------------------------------------------------------------------------------------+
| email    | None                                                                                                                    |
| enabled  | True                                                                                                                    |
| id       | 7ebe3e781ad8425fa40178d457531b68                                                                                        |
| name     | admin                                                                                                                   |
| password | $6$rounds=40000$a797VlO0JL0vlRYU$5WcRyYnZDr5A6FRwsyExZCSQycFsNly30SJ5FhouDnhPe78ZGXFRUUKClr2UPq1c5sIJi8a0eu4vJc2QpaVux/ |
| tenantId | 95d5f489c33c44acaed3f4f04aca1c02                                                                                        |
+----------+-------------------------------------------------------------------------------------------------------------------------+
添加一个admin角色

keystone role-create --name adminRole
执行结果:

+----------+----------------------------------+
| Property |              Value               |
+----------+----------------------------------+
| id       | 5b2974367e734867b4d8fdcc1b66ca7a |
| name     | adminRole                        |
+----------+----------------------------------+
上面我们以此创建了一个租户(tenant), 一个账户(user)和一个角色(role), 通过执行结果我们可以得出:

tenant_id: 95d5f489c33c44acaed3f4f04aca1c02
user_id: 7ebe3e781ad8425fa40178d457531b68
role_id: 5b2974367e734867b4d8fdcc1b66ca7a
然后我们通过下面的命令来将它们关联起来

keystone user-role-add --user 7ebe3e781ad8425fa40178d457531b68 --tenant_id 95d5f489c33c44acaed3f4f04aca1c02 --role 5b2974367e734867b4d8fdcc1b66ca7a
记住,你执行的结果和我这里执行的结果是不同的, 你应该记录好你执行后的tenant id, user id和rola id

我们来试验一下, 刚才的添加的租户、用户是否可用.

sudo apt-get install curl
curl -d '{"auth": {"tenantName": "adminTenant", "passwordCredentials":{"username": "admin", "password": "openstack"}}}' -H "Content-type: application/json" http://10.172.7.81:35357/v2.0/tokens | python -mjson.tool
如果正确的话, 应该得出下面结果:

{
    "access": {
        "serviceCatalog": {},
        "token": {
            "expires": "2012-03-28T03:31:17Z",
            "id": "98bfd57c2a964ae7b0e39cd8cf2a35fd",
            "tenant": {
                "description": "Admin Tenant",
                "enabled": true,
                "id": "95d5f489c33c44acaed3f4f04aca1c02",
                "name": "adminTenant"
            }
        },
        "user": {
            "id": "7ebe3e781ad8425fa40178d457531b68",
            "name": "admin",
            "roles": [
                {
                    "id": "5b2974367e734867b4d8fdcc1b66ca7a",
                    "name": "adminRole"
                }
            ],
            "roles_links": [],
            "username": "admin"
        }
    }
}
注意上面的serviceCatelog是空的, 是因为我们还没有定义服务(Service)和Endpoint, 安装Keystone的工作就完成了。我会在后续的安装中,逐步添加这些内容, 例如Glance, Nova, Swift等等。


总结
其实, 知道keystone在整个Openstack框架中的作用, 以及了解keystone里面的每个对象的作用和用途是非常重要的, 如果我们只知道按照官方的教程去安装keystone, 而不知道里面每个元素是做什么用的, 那么出了问题就很难去解决, 在我们遇到问题的时候, 去看一下 https://bugs.launchpad.net/keystone 这里, 也许你遇到的问题, 别人也同样遇到了, 你可以从这里来确认是你安装的问题还是你遇到了keystone还没有解决的Bug, 当你确认一个Bug的存在, 那么你可以通过那个网址来提交Bug, 以便keystone的开发小组能够知道这个Bug的存在, 并修正它。

------------------------------------------------------------------------------------------------------------------------------------------------

已有(10)人评论

跳转到指定楼层
nettman 发表于 2014-3-1 10:11:15
string2020 发表于 2014-3-1 08:28
export OS_USERNAME=admin
export OS_PASSWORD=ADMIN_PASS
export OS_TENANT_NAME=admin

你可以参考下面文章:
整体认识openstack-----五大组件各自的作用
第十六个问题:
16.keystone除了用户名和密码授权,另外一种授权是什么方式?




回复

使用道具 举报

xioaxu790 发表于 2014-3-1 10:45:21
要得就是这个详细、通俗的讲解,赞一个!
回复

使用道具 举报

xioaxu790 发表于 2014-3-1 11:02:36
本帖最后由 xioaxu790 于 2014-3-1 11:04 编辑

admin用户的 Role VIP等级在其他用户中是最高 和享有最高的权限吗? 还是权限与其他用户都一样
回复

使用道具 举报

pig2 发表于 2014-3-1 11:28:22
xioaxu790 发表于 2014-3-1 11:02
admin用户的 Role VIP等级在其他用户中是最高 和享有最高的权限吗? 还是权限与其他用户都一样

admin权限,默认是所有API权限都有。但是如果需要区分用户的权限必须用它,可以在/etc/nova/policy.json,/etc/glance/policy.json中配置,每个API都可以配置一个权限。
比如我定义一个role叫networkadmin,在policy.json中把所有的网络API都提供给它,那么它就是网络管理员。
如果我把所有的API权限都提供给admin这个role,那么这个role就对所有的操作有权限。

回复

使用道具 举报

xioaxu790 发表于 2014-3-1 15:16:30
pig2 发表于 2014-3-1 11:28
admin权限,默认是所有API权限都有。但是如果需要区分用户的权限必须用它,可以在/etc/nova/policy.json, ...

哦,原来如此,你好样的,学识广泛
回复

使用道具 举报

null 发表于 2014-3-19 22:11:23
好资料,好地方,中文资料聚集
回复

使用道具 举报

SuperTong 发表于 2014-3-26 08:40:02
路过,看看,顶下
回复

使用道具 举报

oscar 发表于 2014-11-8 23:13:42
Nothing can express the gratitude I have for you!
回复

使用道具 举报

doscho 发表于 2015-9-12 19:57:13
在ubuntu 14 测试。同步数据库时出现如下错误:
doscho@keystone:~$ sudo keystone-manage db_sync
Traceback (most recent call last):
  File "/usr/local/bin/keystone-manage", line 6, in <module>
    from keystone.cmd.manage import main
  File "/usr/local/lib/python2.7/dist-packages/keystone/cmd/manage.py", line 32, in <module>
    from keystone.cmd import cli
  File "/usr/local/lib/python2.7/dist-packages/keystone/cmd/cli.py", line 20, in <module>
    from oslo_config import cfg
ImportError: No module named oslo_config

在keystone.conf中没有【sql】,是【database】。是否是版本问题。
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条