Openstack:以管理员身份登录,并通过python从不同的租户检索服务器数据

时间:2015-07-08 06:22:03

标签: openstack openstack-nova devstack

我在python中为Openstack写了一些cron作业,它应该从数据库中读取服务器ID,然后使用python-novaclient从API获取服务器。

在伪代码中,事情应该像这样:

session = login_to_keystone(user="admin", password="something") #or use a token
nova_client = get_nova_client(session)

#the servers array holds dictionaries with server, user and tenant ids as strings
# e.g. {"server_id": "1-2-3", "tentant_id": "456", user_id: "11111-2222"}
for server in servers:
   server_obj = nova_client.servers.get(server.server_id)
   ...do stuff with server_obj (read data from it, delete,...)...

我提出的是以下内容,但由于我收到了EndpointNotFound异常,因此不正确。我和Devoack一起使用Juno。

from keystoneclient.v2_0 import client as keystone_client
from keystoneclient import session
from novaclient import client as nova_client

#the url is the admin endpoint
keystone = keystone_client.Client(token="my-admin-token",
            auth_url="http://192.168.1.1:35357/v2.0",
            endpoint="http://192.168.1.1:35357/v2.0")

key_session = session.Session(auth=keystone)
nova = nova_client.Client(2, session=key_session)

#let's assume the servers array is already populated
for server in servers:
    server_obj = nova.servers.get(server.server_id) #Exception happens here

我需要以管理员身份运行此服务器,因为服务器可以属于任何租户,甚至可能被cron作业删除。

感谢您的帮助!

更新 我需要的信息是,我可以使用管理员租户来检索所有服务器(无论其所有者)。这允许我也使用publicURL。

我目前的解决方案如下:

from keystoneclient.auth.identity import v2
from keystoneclient import session
from novaclient import client as nova_client

auth = v2.Password(auth_url="http://192.168.1.1:5000/v2.0",
                   username="admin",
                   password="my_secrete",
                   tenant_name="admin") # the admin's tenant

auth_session = session.Session(auth=auth)
nova = nova_client.Client(2, session=auth_session)

for server in servers:
    ... do stuff like nova.servers.get("some id")

2 个答案:

答案 0 :(得分:1)

要获取所有租户的服务器列表,您需要执行两项任务:

  1. 以具有管理员权限的用户身份登录,
  2. 告诉Nova API您需要所有租户的服务器列表。
  3. 以管理员用户身份登录

    您似乎正在尝试使用admin_token中定义的keystone.conf进行身份验证。这可能有效,但这种机制主要是作为引导Keystone的一种手段。与其他服务交互时,您需要使用已在Keystone中使用管理员凭据定义的用户名/密码对登录。我认为@ anoop.babu给你的东西会很好:

    >>> nova = nova_client.Client('2', USERNAME, PASSWORD,
                                  PROJECT_ID, AUTH_URL)
    

    其中:

    • USERNAME = admin
    • PASSWORD = password_for_admin_user
    • PROJECT_ID = admin
    • AUTH_URL = http://your_api_server:5000/v2.0

    我们可以使用以下内容测试此客户端:

    >>> nova.hypervisors.list()
    [<Hypervisor: 2>]
    

    这告诉我们我们已经成功验证了。

    列出所有服务器

    如果我们只是调用nova.servers.list(),我们要求admin租户拥有的Nova服务器列表,通常应为空:

    >>> nova.servers.list()
    []
    

    要查看其他租户的服务器,您需要传递all_tenants搜索选项:

    >>> nova.servers.list(search_opts={'all_tenants':1})
    [<Server: cirros0>]
    

    这应该可以让你到达目的地。

答案 1 :(得分:0)

在这里,您已将auth_url作为终点。端点实际上是服务的 publicURL 。 您可以使用以下CLI命令

找到publicURL
nova endpoints

并检查keystone详细信息。

您还可以使用以下api版本获取经过身份验证的keystone对象,而无需使用端点

import keystoneclient.v2_0.client as keystone_client
keystone = keystone_client.Client(auth_url = my_auth_url , username = my_user_name , password = my_password , tenant_name = my_tenant_name )

并创建一个会话对象,如下所示

from keystoneclient import session
key_session = session.Session(auth=keystone)

在没有keystone的情况下获得新星客户授权的另一种简化方法是,

from novaclient import client as nova_client
nova = nova_client.Client('2', USERNAME, PASSWORD, PROJECT_ID, AUTH_URL)

server_obj = nova.servers.find( name=my_server_name )
相关问题