keystone

来源:互联网 发布:电信专线网络的价格 编辑:程序博客网 时间:2024/05/17 11:06

Openstack Hands on lab 1: keystone安装


Keystone (Openstack Identity Service)介绍

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

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

准备环境

os: ubuntu server 11.10 hostname: ps-keystone-01ip address: 10.172.7.81netmask: 255.255.255.0gateway: 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 -pcreate database keystone;grant all on keystone.* to 'keystone'@'%' identified by '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 ~/keystonesudo pip install -r tools/pip-requiressudo python setup.py install

这个过程需要等待一段时间, 接下来把keystone client的依赖项也装好

cd ~/clientsudo pip install -r tools/pip-requiressudo python setup.py install

配置keystone

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

sudo mkdir -p /etc/keystonesudo cp ~/keystone/etc/* /etc/keystone/

修改配置文件 /etc/keystone/keystone.conf, 将

[sql]connection = sqlite:///keystone.db

修改为

[sql]connection = mysql://keystone:openstack@localhost/keystone

然后将
[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=ADMINexport SERVICE_ENDPOINT=http://10.172.7.81:35357/v2.0

同步数据库schema并运行keystone

sudo keystone-manage db_syncsudo 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命令实例

添加租户,用户和用户角色 (tenant, user, role)

我们添加默认的租户 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: 95d5f489c33c44acaed3f4f04aca1c02user_id: 7ebe3e781ad8425fa40178d457531b68role_id: 5b2974367e734867b4d8fdcc1b66ca7a

然后我们通过下面的命令来将它们关联起来

keystone user-role-add --user 7ebe3e781ad8425fa40178d457531b68 --tenant_id 95d5f489c33c44acaed3f4f04aca1c02 --role 5b2974367e734867b4d8fdcc1b66ca7a

记住,你执行的结果和我这里执行的结果是不同的, 你应该记录好你执行后的tenant id, user id和rola id

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

sudo apt-get install curlcurl -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的存在, 并修正它。

Authentication, Endpoint, Keystone, OpenStack, Service, Token

OpenStack Hands on lab系列Openstack Hands on lab 2: Swift安装并使用Keystone做身份验证

  • Pingback: Openstack Hands on lab 2: Swift安装并使用Keystone做身份验证 | LiangBo's Blog

  • Pingback: OpenStack Hands on lab系列 | LiangBo's Blog

  • liangbo

    keystone的git中已经将conf中的catelog backend改为sql.
    https://github.com/openstack/keystone/commit/2e172e515556a76c2febdaa52dea7be95da566c1

  • Rain

    哈囉~我想請教一下adminRole這個是固定用法嗎? 我自己創一個testRole,但是都無法正確驗證帳密登入swift..還是跟token有關?那要怎麼查token? 謝謝~

    • Rain

      root@swift-proxy1:~# swift -V 2 -A http://172.16.70.129:5000/v2.0 -U testTenant:test -K openstack stat
      Account HEAD failed: http://swift.cloud.toolbox:80/v1/AUTHf21a0dbe65134547adbbd71fe2fcd95c 403 Forbidden

      這個是錯誤訊息~謝謝~~

      • liangbo

        不知道你是否指定了reseller_prefix, 如果指定了的话, 你可以看一下是否是reseller_prefix=AUTH, 如果不是的话, 这个endpoint是有问题的, 如果是的话, 你的testTenant的id是否正确, 另外这个test user是否在operator_roles里面

      • 林由清

        我也出现过这样的问题,好像是现在的版本变化原因,tenant名称必须和username 名称相同才能够使用swift服务。
        我这边的实验例子
        工程名 project1 里面 有两个 Member角色的用户 project1 和 user1
        root@Node1:/etc/swift# swift -V 2 -A http://192.168.121.30:5000/v2.0 -U project1:user1 -K password stat
        Account HEAD failed:https://192.168.121.5:8080/v1/AUTH5f8fac4a91ae4eaf81c9950a3640e975 403 Forbidden
        root@Node1:/etc/swift# swift -V 2 -A http://192.168.121.30:5000/v2.0 -U project1:project1 -K password stat
        Account: AUTH5f8fac4a91ae4eaf81c9950a3640e975
        Containers: 1
        Objects: 0
        Bytes: 0
        Accept-Ranges: bytes
        X-Trans-Id: txedc00220eb944f47b7cde57a3d72b8f7

        或者不用指定工程名称 也能够使用 swift服务 ,如下
        root@Node1:/etc/swift# swift -V 2 -A http://192.168.121.30:5000/v2.0 -U project1 -K password stat
        Account: AUTH5f8fac4a91ae4eaf81c9950a3640e975
        Containers: 1
        Objects: 0
        Bytes: 0
        Accept-Ranges: bytes
        X-Trans-Id: txc90173e4db1a4b0cb738e7864101f98f

        你可以对比发现 他们的 account 值 多是相同的。
        我用的swift版本是 stable/essex

        • liangbo

          奇怪, 我没有这个问题。 我的tenant name是adminTenant, username是admin, 一样可以用的啊。 呵呵。 奇怪的问题还真是多。 也没有办法一一看过来。

        • liangbo

          还有个问题, 我相信user1是在project1这个tenant下面的, user1的role在operator_roles里吗?

          • Rain

            感謝兩位的回覆,的確是因為proxy-server.conf內的operator_roles沒填到另一個role。 感謝 Orz

    • liangbo

      你好, adminRole是我试验中指定的rolename, 在有些配置中指定了adminRole的权限, 你可以检查一下配置出现过adminRole的地方。 例如operator_roles之类的(swift proxy-server.conf), 所以你可以改成你需要的rolename就可以了。

  • 王鹏

    root@Controller:/etc/keystone# keystone user-list
    Traceback (most recent call last):
    File “/usr/bin/keystone”, line 37, in
    import keystone.tools.tracer # @UnusedImport # module runs on import
    ImportError: No module named tools.tracer

    请问按照您这篇文章的步骤装了结果还是出现这样的错误
    麻烦您帮忙看下是怎么回事?

    • liangbo

      这个问题,你看一下 https://answers.launchpad.net/keystone/+question/168181

  • rommel

    how can i solve the promblem?
    when i type the command:sudo keystone-manage db_sync
    super(Connection, self).__init__(*args, **kwargs2)
    sqlalchemy.exc.OperationalError: (OperationalError) (1045, “Access denied for user ‘keystone’@'localhost’ (using password: YES)”) None None

    • liangbo

      it means you don’t have the right permission to access mysql. You have to grant ‘keystone’@'localhost’ with the correct rights to database ‘keystone’, login mysql use mysql -u root -p, and execute the follow command:

      grant all on keystone.* to ‘keystone’@'%’ identified by ‘openstack’;

  • Shichao

    但我运行keystone user-list时,返回的结果是printt。
    还有两个警告

    /usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py:681: SADeprecationWarning: The ‘listeners’ argument to Pool (and create_engine()) is deprecated. Use event.listen().
    Pool.__init__(self, creator, **kw)
    /usr/local/lib/python2.7/dist-packages/sqlalchemy/pool.py:159: SADeprecationWarning: Pool.add_listener is deprecated. Use event.listen()
    self.add_listener(l)

    这是什么原因造成的呀?我用的ubuntu版本是12.04。

    • maple

      你找到错误原因了吗? 我也遇到这个问题

  • yexh

    你好,我在运行swift -V 2 -A http://10.10.11.242:5000/v2.0 -U adminTenant:admin -K openstack stat 这个命令的时候 出现这样的报错:[Errno 110] ETIMEDOUT
    我系统版本是:ubuntu 12.04
    请问这个会是什么原因造成的呀?

  • pydev

    您好,我安装您的安装步骤配置keystone,出现错误如下:

    root@ubuntu:/etc/keystone# keystone-manage db_sync
    Traceback (most recent call last):
    File “/usr/local/bin/keystone-manage”, line 5, in
    pkg_resources.run_script(‘keystone==2012.2′, ‘keystone-manage’)
    File “/usr/lib/python2.7/dist-packages/pkg_resources.py”, line 499, in run_scr ipt
    self.require(requires)[0].run_script(script_name, ns)
    File “/usr/lib/python2.7/dist-packages/pkg_resources.py”, line 1235, in run_sc ript
    execfile(script_filename, namespace, namespace)
    File “/usr/local/lib/python2.7/dist-packages/keystone-2012.2-py2.7.egg/EGG-INF O/scripts/keystone-manage”, line 28, in
    cli.main(argv=sys.argv, config_files=config_files)
    File “/usr/local/lib/python2.7/dist-packages/keystone-2012.2-py2.7.egg/keyston e/cli.py”, line 139, in main
    args = CONF(config_files=config_files, args=argv)
    File “/usr/local/lib/python2.7/dist-packages/keystone-2012.2-py2.7.egg/keyston e/config.py”, line 33, in __call__
    return super(ConfigMixin, self).__call__(*args, **kw)
    File “/usr/local/lib/python2.7/dist-packages/keystone-2012.2-py2.7.egg/keyston e/openstack/common/cfg.py”, line 929, in __call__
    self._parse_config_files(from_file + from_dir)
    File “/usr/local/lib/python2.7/dist-packages/keystone-2012.2-py2.7.egg/keyston e/openstack/common/cfg.py”, line 1295, in _parse_config_files
    raise ConfigFileParseError(pe.filename, str(pe))
    keystone.openstack.common.cfg.ConfigFileParseError: Failed to parse /etc/keyston e/keystone.conf: at /etc/keystone/keystone.conf:55, Unexpected continuation line : ‘ connection = mysql://keystone:openstack@localhost/keystone’

  • pydev

    首先,有一步操作,我认为有问题,就是给keystone数据库赋上权限时候;应该是2条,否则是连不上数据库的。
    grant all on keystone.* to ‘keystone’@'%’ identified by ‘openstack’;
    grant all on keystone.* to ‘keystone’@'localhost’ identified by ‘openstack’;

    个人认为:linux下的mysql %认为是除本机以为的任何机器
    windows下的mysql %认为是所有机器包括本机

    • liangbo

      linux上也是包括本机的。 另外抱歉, 最近忙, 没太关注博客上有这么多朋友提问。 等我回去后, 再看看大家的问题。

    • eelilei

      没错,12.04的mysql是要这样做,和11.10不一样

      • eelilei

        梁哥,很期待您关于quantum和melange方面的部署介绍

  • D J

    Answer Shichao’s question:

    Find the keystoneclient/utils.py, replace the pt.printt with print pt.get_string. For instance, find the following line
    pt.printt(sortby=fields[0])
    And change it to
    print pt.get_string(sortby=fields[0])

    Best,
    D.J.

  • Pingback: OpenStack的多数据库支持 (Postgresql for example) | LiangBo's Blog

  • Pingback: URL

  • 铁石

    你好 我安装的时候出现问题,不知道咋弄了 给你看下 谢谢。root@ThinkSer1:~# keystone user-list
    No handlers could be found for logger “keystoneclient.client”
    Unable to authorize user
    root@ThinkSer1:~# keystone debug user-list
    usage: keystone [--os_username ]
    [--os_password ]
    [--os_tenant_name ]
    [--os_tenant_id ] [--os_auth_url ]
    [--os_region_name ]
    [--os_identity_api_version ]
    [--token ] [--endpoint ]
    [--username ] [--password ]
    [--tenant_name ] [--auth_url ]
    [--region_name ]

    keystone: error: argument : invalid choice: ‘debug’ (choose from ‘catalog’, ‘ec2-credentials-create’, ‘ec2-credentials-delete’, ‘ec2-credentials-get’, ‘ec2-credentials-list’, ‘endpoint-create’, ‘endpoint-delete’, ‘endpoint-get’, ‘endpoint-list’, ‘role-create’, ‘role-delete’, ‘role-get’, ‘role-list’, ‘service-create’, ‘service-delete’, ‘service-get’, ‘service-list’, ‘tenant-create’, ‘tenant-delete’, ‘tenant-get’, ‘tenant-list’, ‘tenant-update’, ‘token-get’, ‘user-create’, ‘user-delete’, ‘user-get’, ‘user-list’, ‘user-password-update’, ‘user-role-add’, ‘user-role-remove’, ‘user-update’, ‘discover’, ‘help’)

    • liangbo

      嗯, 认证未通过, 你需要
      export OS_USERNAME=用户名(有管理权限)
      export OS_PASSWORD=password
      export OS_AUTH_URL=http://keystone.address:5000/v2.0
      export OS_TENANT=tenant

      然后执行keystone命令, 或者你执行keystone的时候带上 –os_username=xxx –os_password=xxx –os_tenant=xxx –os_auth_url=xxx

  • Guest

    作者能否帮我解惑!为什麽我现在有oslo模块,而无法使用能,第一次我以为自己安装方面的失误,重新装了一次还是同样的问题。

  • osxlinux

    作者能否解惑一下这是为什么么?我的模块已经安装,为什么无法使用呢?

    • liangbo

      试试装下这个 https://github.com/openstack/oslo.config

      按理说, 如果是pip install -r tools/pip-required的话, 应该是会装这个的