【问题标题】:getting user list from openstack keystone api从openstack keystone api获取用户列表
【发布时间】:2012-10-30 20:18:55
【问题描述】:

我想对 openstack keystone 用户执行 CRUD 操作。根据 keystone api docs,我们必须使用 GET 请求以及 x-auth-token 信息。我为此编写了一个代码,但我无法获得任何用户列表,而是得到“404 Not Found,The resource could not be found”。我的代码如下

#!/usr/bin/python
import httplib
import urllib
import os
import json
from urlparse import urlparse
#Define openstack url
url = "x.x.x.x:5000"
osuser = "osuser"
ospassword = "whatever"

params ='{"auth":{"tenantName":"openstackDemo", "passwordCredentials":{"username":"osuser", "password": "ospassword"}}}'
headers = {"Content-Type": "application/json"}
#make http request
conn = httplib.HTTPConnection(url)
conn.request("POST", "/v2.0/tokens", params,headers)
#get http response
response = conn.getresponse()
data = response.read()
verify_services = json.loads(data)
conn.close()
#print "The service verificetion is:%s\n\t" % verify_services
#Get keystone token
keystone_token = verify_services ['access']['token']['id']
print "Printing api token :\n" 
print keystone_token
user_id = verify_services['access']['user']['id']
print "Printing user id : \n"
print user_id
# Get keystone URL

keystone_url = verify_services ['access']['serviceCatalog'][5]
print "Printing keystone end points url: \n"
print keystone_url

#Now take the keystone public url and uid

for publicurl in keystone_url['endpoints']:
key_admin_url = publicurl['adminURL']
key_pub_url = publicurl['publicURL']
keystone_user_id = publicurl['id']      

print "printing keystone public url:\n"
print key_pub_url

print "Printing keystone user id:\n"
print keystone_user_id


##################
# Get the user list
#################
apiurlt = urlparse(key_pub_url)
print apiurlt
url2 = apiurlt[1]
print url2
#params1 = '{"username":"samit", "email":"sanjaya@kth.se","enabled":true,"password":"secret", "roles":"member"}'
p = urllib.urlencode({})
headers1 = {"X-Auth-Token":"keystone_token", "Content-type":"application/json"}
conn2 = httplib.HTTPConnection(url2)
conn2.request("GET", "%s/users" %apiurlt[2]  , p,headers1)
response2 = conn2.getresponse()
data2 = response2.read()
user_list = json.dumps(data2)
conn.close()
print "getting users:\n"
print response.status
print response.reason
print user_list

【问题讨论】:

    标签: python api openstack keystone


    【解决方案1】:

    @sanjaya,如果您正在寻找一种通过 Python 快速与 Keystone 交互的方法,我建议您直接使用 keystoneclient 库,它内置了所有这些相关工作。您可以在 https://github.com/openstack/python-keystoneclient/ 获取源代码,或从 PyPi (http://pypi.python.org/pypi/python-keystoneclient/0.1.3) 下载相对较新的(源中的主干是较新的)版本。

    使用该客户端,您可以超级轻松地与 Keystone 交互:

    from keystoneclient.v2_0 import client
    kc = client.Client(username=osuser, password=ospassword, auth_url=url)
    

    请注意,仅使用用户名和密码,您的访问权限将非常有限(所谓的“无范围访问授权令牌”),您需要进一步请求才能做任何有用的事情。

    Keystone 更是如此,在 API V2 中,需要“管理员”角色才能与 keystone 上的任何 CRUD 操作进行交互。在您只想与 Keystone 交互的情况下(例如在设置许多其他部分之前启动帐户),从“管理令牌”开始并直接从客户端使用管理 URL 界面会更容易.为此:

    from keystoneclient.v2_0 import client
    kc = client.Client(token='123secret456', endpoint='http://x.x.x.x:35350/v2.0')
    kc.users.list()
    

    令牌是您在 Keystone 中“admin_token”下的 [DEFAULT] 部分中已配置的令牌。请注意,端点 URL 是与授权 URL 不同的端口 (35350)。无论好坏,V2 API 都将它们明确分开,并且要对 Keystone 中的元素执行 CRUD 操作,您需要使用 API 端点的管理 URL。

    如果您使用 Everett 上面提供的示例进行身份验证,则该管理 URL 将由 keystoneclient 自动加载,因此对于该库,您通常不必担心。

    为了完整起见,使用 Python 中的 keystoneclient 库执行 Everett 上面的建议:

    from keystoneclient.v2_0 import client
    kc = client.Client(username='admin', password='devstack', tenant_name='admin', auth_url='http://172.16.0.1:5000/v2.0')
    kc = client.users.list()
    

    【讨论】:

      【解决方案2】:

      使用 bash 这就是我的工作

      TOKEN=`curl -s -X POST http://172.16.0.1:35357/v2.0/tokens -d '{"auth": {"passwordCredentials": {"username":"admin", "password":"devstack"}, "tenantName":"admin"}}' -H "Content-type: application/json" | python -c 'import json,sys; response=json.loads(sys.stdin.read()); print response["access"]["token"]["id"]'`;
      
      curl -s http://172.16.0.1:35357/v2.0/users -H "X-Auth-Token: "$TOKEN""
      

      请注意,我正在以管理员身份进行身份验证。也许里面的东西会对你有所帮助。

      【讨论】:

      • 谢谢,但我得到了一个有效的 x-auth 令牌,但无法列出用户。但是,当我将端口更改为 35357 时,出现以下错误。 "{\"error\": {\"message\": \"您发出的请求需要认证。\", \"code\": 401, \"title\": \"Not Authorized\"}} "
      • 嘿,我只是能够列出用户,但我没有使用 api 令牌,而是使用 master seceret。但是,每次我用 keystone get-token 命令询问时,我的 api 令牌似乎都在改变。我不知道为什么,但是根据 keystone conf 文件和文档,api 令牌似乎在 24 小时内有效,并且应该是相同的 32 位随机数。有人对此有任何想法..谢谢
      • 如果您正在向172.16.0.1:35357/v2.0/tokens 发送 POST,您应该获得一个新令牌,请参阅docs.openstack.org/api/openstack-identity-service/2.0/content/… 获得令牌后,您需要自己跟踪它以便重用它。您可以在docs.openstack.org/api/openstack-identity-service/2.0/content/… 找到所有令牌操作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多