OpenStack Stein版本API无法返回实例数据问题求助
解决OpenStack Nova API返回空实例列表的问题
问题原因
你在认证时使用了无作用域(unscoped)的token,OpenStack Nova API默认只会返回当前token作用域内项目的实例。你的CLI是在keystone_admin项目上下文下执行的,因此能看到实例,但API请求未指定项目范围,导致返回空列表。
解决方案
方法1:认证时指定项目作用域
修改认证请求参数,添加项目作用域信息,确保获取的token包含keystone_admin项目的上下文:
import requests, json identity = { "methods": ["password"], "password": { "user": { "name": "admin", "domain": {"id": "default"}, "password": "xxxxxxxxxxxxxxx" } } } OS_AUTH_URL = 'http://x.x.x.x:5000/v3' # 新增项目作用域配置 data = { 'auth': { 'identity': identity, 'scope': { 'project': { 'domain': {'id': 'default'}, 'name': 'keystone_admin' # 对应CLI环境中的项目名称 } } } } # 移除headers中的无效scope字段,作用域需在请求体中定义 HEADERS = {'Content-Type': 'application/json'} r = requests.post( OS_AUTH_URL + '/auth/tokens', headers=HEADERS, json=data, verify=False ) auth_token = r.headers['X-Subject-Token'] # 调用Nova API获取实例列表 NOVA_URL = "http://x.x.x.x:8774/v2.1" HEADERS = {"X-Auth-Token": str(auth_token)} r = requests.get( NOVA_URL + '/servers', headers=HEADERS, ) r.raise_for_status() print(json.dumps(r.json(), indent=2))
方法2:在Nova API请求中指定项目ID
若不想修改认证流程,可先通过Keystone API获取keystone_admin项目的ID,再将其添加到Nova API的请求路径中:
# 先获取keystone_admin项目的ID HEADERS = {'Content-Type': 'application/json', 'X-Auth-Token': auth_token} project_r = requests.get( OS_AUTH_URL + '/projects?name=keystone_admin&domain_id=default', headers=HEADERS, verify=False ) project_id = project_r.json()['projects'][0]['id'] # 用项目ID拼接Nova API请求路径 r = requests.get( NOVA_URL + f'/{project_id}/servers', headers=HEADERS, ) r.raise_for_status() print(json.dumps(r.json(), indent=2))
验证说明
修改后重新运行代码,即可获取与CLI一致的3个实例数据。你也可以通过调用GET /auth/tokens(携带X-Auth-Token头部)验证token的作用域,确认其包含正确的项目上下文。
内容的提问来源于stack exchange,提问作者Kavin Kumar
相关产品推荐
相关产品推荐

