Python调用Openstack API
本文将介绍如何使用
python
调用OpenStack API
。
什么是RESTful API
RESTful API 就是 RESTful
风格的 API。遵循 RESTful
风格开发的API被叫做 RESTful API
。
那么什么是 RESTful
风格呢。
首先需要明确的是,REST并没有一个明确的标准,而是一种设计风格,这种风格有这样几个主要特征:
- 统一接口,这是
RESTful
设计的基础。这意味着服务器以标准格式传输信息。 - 无状态,客户端可以以任意顺序请求资源,每个请求为无状态或独立于其他请求,这种设计让服务器每次都可以完全识别和满足请求。
- 层次化系统,在这种架构中,客户端可以连接到客户端和服务器之间的其他授权中间方,其仍将接受来自服务器的响应。服务器也可以将请求传递到其他服务器。
RESTful API如何工作?
RESTful API基于 HTTP
协议,以下是在调用 REST API
时发生的一系列步骤:
1.客户端向服务器发送请求,客户端以服务器可识别的方式设置请求格式。
2.服务器对客户端进行身份验证,并确认客户端有权发送该请求。
3.服务器接受请求并对其进行内部处理。
4.服务器向客户端返回响应。响应包含通知客户端请求是否成功的信息。
RESTful API 客户端请求包含哪些内容?
RESTful API 要求请求包含以下主要组件:
唯一的资源标识符(URL)
服务器通过唯一的资源标识符识别每个资源。对于 REST
服务,服务器通常使用统一的资源定位符(URL)执行资源识别。URL指定资源的路径。URL也称为请求端点,并向服务器清晰的指明客户端请求的内容。
方法
也就是 HTTP方法
,这将通知服务器需要对资源执行什么操作。一般常见的 HTTP 方法有以下几种。
方法名 | 描述 |
---|---|
GET | 访问位于服务器上指定URL上的资源,查询资源的列表 |
POST | 向服务器发送数据,在标识的资源后创建新的数据 |
PUT | 向服务器发送数据,更新服务器上的现有资源 |
DELETE | 使用DELETE请求删除资源 |
HTTP头
也叫请求头或 HEAD
,请求头时客户端和服务器之间交换的元数据,它包含了请求和响应的格式,提供有关请求状态的信息等。
数据
也就是请求正文或者叫 body
体,包含了HTTP方法成功运行所需的数据。
RESTful API服务器响应包含哪些内容?
状态码
状态码时三位的数字代码,表示请求成功或者请求出现故障。常见的状态代码有这些:
- 200: 通用成功响应
- 201: POST方法成功响应
- 400: 服务器无法处理的不正确请求
- 401: 未找到资源
信息正文
服务器返回的数据实体,一般以JSON格式数据返回给客户端。
OpenStack API操作
OpenStack API就是遵循RESTful 风格开发的,因此我们可以根据OpenStack API说明文档来调用OpenStack RESTful 接口完成相关的操作。
获取令牌
在使用 RESTful API 管理OpenStack资源之前,需要通过认证服务认证,这里的认证服务一般指Keystone
,对应的API为 Identity
。
Identity API v3 (CURRENT) — keystone documentation (openstack.org)
在 Identity
API 说明中,我们知道,每次向 OpenStack 服务发出 REST API 请求时,都需要在请求标头中提供 X-Auth-Token
身份验证令牌。
OpenStack Identity通过定义RBAC策略规则来保护其API。
获取令牌的例子
让我们用一个例子来直观的感受RESTful API的调用过程。
假设我们的Openstack集群中的 controller
节点IP地址为 192.168.100.10
, 登录用户为admin
,密码为000000
,域为demo
。
那么我们应该如何获取有效的token
呢。
这里使用 APIFOX 来演示,APIFOX 是API一体化协作平台,可以用它进行接口测试。
我们先来创建一个post
示例,如下图所示:
其中方法使用 POST
,URL填写http://192.168.100.10:5000/identity/v3/auth/tokens
,
在这个示例中,请求头,也就是Headers
,加入Content-Type: application/json
,因为我们传入的数据是 json
格式的,在请求正文中,也就是Body,填入以下信息:
{
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
完成后我们点击发送,就可以获得以下返回
返回状态码为201,说明创建成功,接下来我们看看返回了哪些数据。
首先是 Body
,也就是信息正文,这部分包含了用户信息和所有可操作的 api 的 endpoint
,也就是 URL
。
接着是 Header
,这部分的 X-Subject-Token
就是我们需要的身份验证令牌,也就是Token
。我们可以直接复制来进行下一步操作。
有了身份验证令牌,我们就可以调用 OpenStack 的 API 来完成我们需要的操作了。
比如,我们想要查看 OpenStack 平台中的用户信息。
Identity API v3 (CURRENT) — keystone documentation (openstack.org)
我们可以发送 GET
请求来完成这一操作。
在进行这一操作前,我们需要明确以下几个要素
- URL: http://192.168.100.10:5000/v3/users
- HTTP方法:
GET
- Header:
X-Auth-Token: token
- Body:
Null
可以看到,这样的请求被OpenStack API 接受并正确的处理,返回的状态码为200,返回的Body
中,用户信息以json
格式显示。
在经过这样几个例子之后,如何使用Python进行调用就变得很容易了。
Python调用OpenStack API
首先打开Pycharm,这是一个Python IDE,在Pycharm中,我们需要使用Python来复现之前的操作。
需要用到的库有json
和requests
,这两个库将帮助我们处理json格式的数据和发送HTTP请求。
第一步我们需要获取身份验证令牌,也就是Token
。
编写以下Python文件:
import json,requests
# URL
url = f"http://192.168.100.10:5000/v3/auth/tokens"
# 请求正文,Body
body = {
"auth": {
"identity": {
"methods": [
"password"
],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
# 请求头,Header
headers = {
"Content-Type": "application/json"
}
# 发送HTTP方法为POST
response = requests.post(url, json.dumps(body), headers)
# 输出返回的Header中的token
print(response.headers["X-Subject-Token"])
运行的输出就是我们需要的身份验证令牌Token
。
那么接下来,我们如何去使用 Token
来调用其他的OpenStack API呢。
首先我们需要知道OpenStack组件的API地址,也就是URL
,在OpenStack平台controller
节点界面中键入以下命令:
openstack endpoint list -c 'Service Name' -c 'URL'
可以看到以下输出:
+--------------+-----------------------------+
| Service Name | URL |
+--------------+-----------------------------+
| neutron | http://controller:9696 |
| nova | http://controller:8774/v2.1 |
| placement | http://controller:8778 |
| glance | http://controller:9292 |
| neutron | http://controller:9696 |
| neutron | http://controller:9696 |
| keystone | http://controller:5000/v3/ |
| nova | http://controller:8774/v2.1 |
| glance | http://controller:9292 |
| keystone | http://controller:5000/v3/ |
| placement | http://controller:8778 |
| nova | http://controller:8774/v2.1 |
| keystone | http://controller:5000/v3/ |
| glance | http://controller:9292 |
| placement | http://controller:8778 |
+--------------+-----------------------------+
这就是当前OpenStack平台中API的URL
。
我们试着查询OpenStack平台中的用户数据,编写以下python代码
class user:
def __init__(self,token):
self.url = f"http://192.168.100.10:5000/v3/users"
self.headers = {
"X-Auth-Token": token
}
def list(self):
response = requests.get(self.url, headers=self.headers)
return response.json()
if __name__ == '__main__':
user = user(response.headers["X-Subject-Token"])
userlist = user.list()
for i in userlist['users']:
print(i)
其中response.headers["X-Subject-Token"]
就是我们之前拿到的Token
,你可以直接复制使用之前获取的Token。
输出的结果如下:
{'name': 'admin', 'links': {'self': 'http://192.168.100.10:5000/v3/users/a25fd183981a4c8393dca267a149e3b9'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'options': {}, 'default_project_id': '5271453457a441f7afe80175b4bcc830', 'id': 'a25fd183981a4c8393dca267a149e3b9', 'password_expires_at': None}
{'password_expires_at': None, 'name': 'demo', 'links': {'self': 'http://192.168.100.10:5000/v3/users/1b83726b7b60402d929fb1d411d277c1'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'id': '1b83726b7b60402d929fb1d411d277c1', 'options': {}}
{'password_expires_at': None, 'name': 'glance', 'links': {'self': 'http://192.168.100.10:5000/v3/users/80132166cf7e43bdbe22b155870caca5'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'id': '80132166cf7e43bdbe22b155870caca5', 'options': {}}
{'password_expires_at': None, 'name': 'placement', 'links': {'self': 'http://192.168.100.10:5000/v3/users/8bb206274d9f419aafcb302a4c62cc23'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'id': '8bb206274d9f419aafcb302a4c62cc23', 'options': {}}
{'password_expires_at': None, 'name': 'nova', 'links': {'self': 'http://192.168.100.10:5000/v3/users/2bae281a78ae4964bd753370f8be64c4'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'id': '2bae281a78ae4964bd753370f8be64c4', 'options': {}}
{'password_expires_at': None, 'name': 'neutron', 'links': {'self': 'http://192.168.100.10:5000/v3/users/276840fa4c9f43e6becc63c044a03af7'}, 'domain_id': 'c9a6a175f6614182a72cf2ea13915c29', 'enabled': True, 'id': '276840fa4c9f43e6becc63c044a03af7', 'options': {}}
现在已经明白如何使用Python调用OpenStack API了吧。
如果想要调用OpenStack平台其他组件的API,只需要查阅API文档,根据其不同方法编写对应的Python代码即可。
Python调用Openstack API的更多相关文章
- python调用openstack的api,create_instance的程序解析
python调用openstack的api,create_instance的程序解析 2017年10月17日 15:27:24 CloudXli 阅读数:848 版权声明:本文为博主原创文章,未经 ...
- 使用Python调用Flickr API抓取图片数据
Flickr是雅虎旗下的图片分享网站,上面有全世界网友分享的大量精彩图片,被认为是专业的图片网站.其API也很友好,可以实现多种功能.这里我使用了Python调用其API获得了大量的照片数据.需要注意 ...
- 基于python调用libvirt API
基于python调用libvirt API 1.程序代码 #!/usr/bin/python import libvirt import sys def createConnection(): con ...
- 关于python调用zabbix api接口
因公司业务需要,引进了自动化运维,所用到的监控平台为zbbix3.2,最近正在学习python,计划使用python调用zabbix api接口去做些事情,如生成报表,我想最基本的是要取得zabbix ...
- Python调用win32 API绘制正弦波
Python调用win32 API新建窗口与直接创建窗口的流程相同 流程:注册窗口→创建窗口→显示窗口→更新窗口→消息循环 代码: # -*- coding: utf-8 -*- import win ...
- python 调用zabbix api接口实现主机的增删改查
python程序调用zabbix系统的api接口实现对zabbix_server端主机的增删改查,使用相关功能时候,需要打开脚本中的相关函数. 函数说明: zabbixtools() 调用zabbi ...
- 『Python』Python 调用 ZoomEye API 批量获取目标网站IP
#### 20160712 更新 原API的访问方式是以 HTTP 的方式访问的,根据官网最新文档,现在已经修改成 HTTPS 方式,测试可以正常使用API了. 0x 00 前言 ZoomEye 的 ...
- Python调用ansible API系列(四)动态生成hosts文件
方法一:通过最原始的操作文件的方式 #!/usr/bin/env python # -*- coding: utf-8 -*- """ 通过操作文件形式动态生成ansib ...
- python 调用zabbix api实现查询主机信息,输出所有主机ip
之前发现搜索出来的主机调用zabbix api信息都不是那么明确,后来通过zabbix官方文档,查到想要的api信息,随后写一篇自己这次项目中用到的api. #!/usr/bin/env python ...
- python调用java API
JPype documentation JPype is an effort to allow python programs full access to java class libraries. ...
随机推荐
- Uniapp And Taro一些小测评
前情 最近公司准备新开发一个小程序项目,对于使用哪一款小程序框架有一些犹豫,我有过2年左右的uniapp项目开发经验,Taro在刚刚出来的时候有尝试过,经常莫名报错需要重启,在内心是有些偏向uniap ...
- JavaWeb4
1. Filter 1.1 概述 Filter:过滤器 Servlet.Filter和Listener称为Web的三大组件 生活中的过滤器:净水器.空气净化器.土匪 web中的过滤器:当访问服务器的资 ...
- Oracle用户创建及删除
偶尔会用到,记录.分享. 1. Oracle用户创建 #创建用户表空间create tablespace $username datafile '/u01/app/oracle/oradata/ufg ...
- vulnhub靶场之DOUBLETROUBLE: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:DOUBLETROUBLE: 1,网段地址我这里设置的桥接,所以与本机电脑在同一网段,下载地址:https://download.vulnhub ...
- sqlserver数据库还原
这里是从A服务器备份的数据库文件,还原到本地B电脑的数据库.因数据库版本相同,故而未曾出现其他版本问题 1.有个bak的备份文件 2.在B电脑新建一个数据库test. 3.设置test数据库的访问限制 ...
- easui datagrid 行获取后台sql所有数据:支持行chockbox多选,输出选中行任意属性;支持点击表中属性实现跳转;支持分页。
easyUI datagrid 代码: <table id="tabgrid20170726191838251403" class="easyui-datagrid ...
- Java开发学习(四十五)----MyBatisPlus查询语句之映射匹配兼容性
1.映射匹配兼容性 我们已经能从表中查询出数据,并将数据封装到模型类中,这整个过程涉及到一张表和一个模型类: 之所以数据能够成功的从表中获取并封装到模型对象中,原因是表的字段列名和模型类的属性名一样. ...
- 【SQL进阶】【表默认值、自增、修改表列名、列顺序】Day02:表与索引操作
一.表的创建.修改与删除 1.创建一张新表 [设置日期默认值.设置id自增] [注意有备注添加备注COMMENT] CREATE TABLE user_info_vip( id int(11) pri ...
- Kubernetes(k8s)存储管理之数据卷volumes(四):持久卷Persistent Volume
目录 一.系统环境 二.前言 三.持久卷(Persistent Volume) 3.1 持久卷(Persistent Volume)概览 3.2 持久卷和持久卷申领的生命周期 3.3 持久卷的类型 3 ...
- Jmeter 之连接数据库
1.下载mysql-connector-java-5.1.7-bin.jar 2.下载后将该jar包放于bin目录下,如:D:\Program Files\apache-jmeter-5.2\bin ...