内容简介:与openstack api交互有多种方法首先本文中client指那些与openstack api交互的项目,比如python-xxxclient或openstacksdk,这些client封装了具体的api请求过程,提供给用户更友好的操作方式, 比如nova命令来自这些client的共性是他们都需要认证和发起请求,因此认证和请求这部分可以独立出来实现,各个client就不需要都自己实现一套认证请求流程了,这就是keystoneauth的作用,各个client可以专注于自己的功能实现
keystoneauth组件介绍
与openstack api交互有多种方法
- 可以自己开发client直接调用api
- 可以直接使用openstack提供的封装sdk项目 openstacksdk
-
可以使用python-xxxclient等项目,比如
python-novaclient,python-neutronclient -
可以直接使用命令行工具
nova,neutron,openstack等
首先本文中client指那些与openstack api交互的项目,比如python-xxxclient或openstacksdk,这些client封装了具体的api请求过程,提供给用户更友好的操作方式, 比如nova命令来自 python-novaclieent
,neutron命令来自 python-neutronclient
,openstack命令来自 python-openstackclient
。
这些client的共性是他们都需要认证和发起请求,因此认证和请求这部分可以独立出来实现,各个client就不需要都自己实现一套认证请求流程了,这就是keystoneauth的作用,各个client可以专注于自己的功能实现
keystoneauth是一个相对独立的组件,它在整个openstack生态中提供统一认证和服务请求,因此client中不再需要处理token/headers/api地址这些信息,client需要做的只是import keystoneauth,提供必要的参数(region/用户凭据/api版本等)并调用keystoneauth中的接口,keystoneauth负责管理token和组装完整的api url(根据catalog和api的path)并最终发出api请求,client可以对返回值做友好处理后返回给用户
keystoneauth中实现认证和服务请求的是 keystoneauth1.session.Session
类,我们可以用它来初始化一个Session对象,此对象可以存储用户凭据(用户名密码)和连接信息(比如token),使用同一个Session对象的各个client之间会共享认证和请求信息。 我们先来看看如何初始化一个Session对象
#[root@controller openstack]# cat ses.py
#----
#!/usr/bin/env python
from keystoneauth1.identity import v3
from keystoneauth1 import session
auth = v3.Password(username='admin',
password='admin',
project_name='admin',
user_domain_name='Default',
project_domain_name='Default',
auth_url='http://controller:35357/v3')
sess = session.Session(auth=auth)
#----
#实例化一个Session对象
[root@controller openstack]# python
Python 2.7.5 (default, Nov 6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ses import sess
如上,我们初始化了一个Session类的实例对象 sess
,初始化Session需要提供必要的参数,我们在使用命令行之前需要source的环境变量( OS_PROJECT_NAME
, OS_USERNAME
, OS_PASSWORD
,…)其实最后也是传递给了keystoneauth。现在来看看能用这个对象做什么
keystoneauth组件可以做什么
获取token
>>> sess.auth
<keystoneauth1.identity.v3.password.Password object at 0x3c17750>
>>> sess.get_token()
'gAAAAABbWX72UZT-RJnHtuFXpqecNuGFIhEAke_Rira3gfUesIuyvM5w2sEV6bnXC_uyo7rOn5RmYbZwADn2eT6AuvHXkRGHVoE25A6bkkXr6vWGZAd8fXHITK751UBrg8obFBGGNWoZpPhG87qFtmZ1yuLM3uebFFB4lfCTXoJ70D0my0X1GRc'
>>> sess.get_auth_headers()
{'X-Auth-Token': 'gAAAAABbWX72UZT-RJnHtuFXpqecNuGFIhEAke_Rira3gfUesIuyvM5w2sEV6bnXC_uyo7rOn5RmYbZwADn2eT6AuvHXkRGHVoE25A6bkkXr6vWGZAd8fXHITK751UBrg8obFBGGNWoZpPhG87qFtmZ1yuLM3uebFFB4lfCTXoJ70D0my0X1GRc'}
如上,当执行 get_token()
后,使用 sess.auth
里保存的用户凭证向keystone api提交POST请求( POST http://controller:35357/v3/auth/tokens
)获取一个token
此Token可以被多个使用此sess对象的client共享,这样各个client就不需要都走一边完整的获取token流程
##过滤endpoint地址
我们平常在使用openstack命令时并没有指定具体的api地址,实际上,组装出完整的api地址也是keystoneauth的责任,那么Session对象是如何知道完整的api地址呢
#指定endpoint过滤条件
>>> identity_endpoint_filter={'service_type': 'identity',
... 'interface': 'admin',
... 'region_name': 'bjff-1',
... 'min_version': '2.0',
... 'max_version': '3.4',}
#根据endpoint_filter获取对应的endpoint url
>>> sess.get_endpoint(sess.auth, **identity_endpoint_filter)
u'http://controller:35357/v3/'
#service_type改为compute,再获取endpoint url
>>> identity_endpoint_filter['service_type'] = 'compute'
>>> sess.get_endpoint(sess.auth, **identity_endpoint_filter)
u'http://controller:8774/v2.1/1987639927c94519ab8aaf3413a68df9'
openstack中的各个服务在安装时都要向endpoint注册( openstack endpoint list
可以看到当前openstack中已注册的所有服务), identity_endpoint_filter
过滤参数作用就是在openstack endpoint中找出匹配项的url,当然,我们这里是手动指定的 identity_endpoint_filter
参数,实际上的过滤参数是client根据用户输入的命令所属的服务类型以及环境变量生成的
简单说下过滤参数含义:
-
service_type: 服务类型,比如
identity,compute,volume等(openstack endpoint list中可以看到) - min_version,max_version: 用于过滤在其范围内的api主版本,openstack中各个服务都有其主版本,比如目前keystone是v3版本,nova是v2版本,注意不是microversion
上面也提到,组装出完整的api地址是keystoneauth的责任,client只需要提供必要的endpoint过滤参数以及访问路径(比如 /users
),最终完整api url就是endpoint url + ‘/users’
直接发送api请求
事实上,我们可以直接用sess对象发起api请求,其它client的api请求最终也是调用的sess对象
#确认下endpoint_filter
>>> identity_endpoint_filter
{'service_type': 'identity', 'interface': 'admin', 'min_version': '2.0', 'max_version': '3.4', 'region_name': 'bjff-1'}
#获取所有user(user list)
>>> response = sess.get('/users',endpoint_filter=identity_endpoint_filter)
>>> response.json()
{u'users': [{u'password_expires_at': None, u'links': {u'self': u'http://controller:35357/v3/users/006cbddb9dde423695d00d94e68f1b19'}, u'enabled': True, u'id': u'006cbddb9dde423695d00d94e68f1b19... }
#service type改为compute
>>> compute_endpoint_filter['service_type'] = 'compute'
>>> compute_endpoint_filter
{'service_type': 'compute', 'interface': 'admin', 'min_version': '2.0', 'max_version': '3.4', 'region_name': 'bjff-1'}
#获取所有虚拟机(server list)
>>> response = sess.get('/servers',endpoint_filter=compute_endpoint_filter)
>>> response.json()
{u'servers': [{u'id': u'0a57d543-1e8f-49c3-a731-c9198dd3ecb7', u'links': [{u'href': u'http://controller:8774/v2.1/1987639927c94519ab8aaf3413a68df9/servers/0a57d543-1e8f-49c3-a731-c9198dd3ecb7', u'rel': u'self'}, {u'href': ...}
#当然还可以获取所有虚拟机详细信息
response = sess.get('/servers/detail',endpoint_filter=compute_endpoint_filter)
简单说下 sess.get('/servers',endpoint_filter=compute_endpoint_filter)
处理过程如下:
compute_endpoint_filter http://controller:8774/v2.1/1987639927c94519ab8aaf3413a68df9/servers
配合client
上面那种直接调用Session对象发送api还是太麻烦,client对此有更高层次的封装
比如平常使用的 nova list
命令来自 python-novaclient
项目,下面演示了 python-novaclient
中是如何使用Session对象
列出所有镜像
>>> from glanceclient import Client as gsclient
>>> glance_client = gsclient('2', session=sess)
>>> glance_client.images.list()
<generator object list at 0x32b2c80>
列出所有虚拟机
>>> from novaclient import client as noclient
>>> nova_client = noclient.Client('2', session=sess)
>>> nova_client.servers.list()
[<Server: bjff-nginx02>, <Server: bjff-nginx03>, <Server: bjff-nginx01>]
#当然,也可以创建虚拟机
>>> nova_client.servers.create('instance1',
... image='a88fe8b1-15ed-41af-898a-162447ca8d66',
... flavor='82f7cfad-d792-4d39-bde1-e89369c36244',
... nics=[{'net-id': '2bcb3404-9f7c-4bb9-9bac-521c97be19e2'}],
... min_count=1,max_count=1)
<Server: instance1>
以上所述就是小编给大家介绍的《openstack中统一认证组件keystoneauth介绍及使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 如何优雅的在 Java 中统计代码块耗时
- MySQL 8.0 中统计信息直方图的尝试
- MySQL 8.0 中统计信息直方图的尝试
- React 组件模式-有状态组件 x 无状态组件、容器组件 x 展示组件、高阶组件 x 渲染回调(函数作为子组件)
- Serverless 组件开发尝试:全局变量组件和单独部署组件
- angular自定义组件-UI组件篇-switch组件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
设计模式
[美] Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides / 李英军、马晓星、蔡敏、刘建中 等 / 机械工业出版社 / 2000-9 / 35.00元
这本书结合设计实作例从面向对象的设计中精选出23个设计模式,总结了面向对象设计中最有价值的经验,并且用简洁可复用的形式表达出来。书中分类描述了一组设计良好、表达清楚的软件设计模式,这些模式在实用环境下特别有用。此书适合大学计算机专业的学生、研究生及相关人员参考。 书中涉及的设计模式并不描述新的或未经证实的设计,只收录了那些在不同系统中多次使用过的成功设计。一起来看看 《设计模式》 这本书的介绍吧!