我在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")
答案 0 :(得分:1)
要获取所有租户的服务器列表,您需要执行两项任务:
您似乎正在尝试使用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命令
找到publicURLnova 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 )