api调用openstack组件
使用python3 [文件]创建资源。
【api调用创建flavor】
import requests #调用requests模块
import json #调用json模块
import os #调用os模块
headers = {"a":"b"} #设置一个字典,没有后面headers无法写入
data = { #这里给data赋值,这里赋的值是json文件,放置发起请求需要用到的用户密码认证
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
#更准确的规定用户
#因为一个域里一个项目不允许存在相同用户,一个域里面有多个项目不同项目可以存在相同的用户名。
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
#这里给字典写入数据,X-Auth-Token做键,通过链接访问页面获取token写入,token做值,keystone有两个端口,一个是35357的admin端口
#一个是5000端口,属于public和internal端口
data = { #这里一样是给data赋值一个json文件
'flavor': {
'name': 'test_flavor',
'id': '666',
'ram': 2048,
'disk': 20,
'vcpus': 2
}
}
requests.post('http://192.168.100.10:8774/v2.1/flavors', headers=headers, json=data).json()
#再次发起请求,模拟命令向api发起的请求,然后创建flavor。
print("创建成功")
注意点:链接,认证信息中的密码需要“”必须是键值对的格式。
使用diff可以核对文件的差异。
【api调用创建image】
import requests
import json
import os
headers = {"a":"b"}
data = {
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
data = { #这里设置镜像信息,上面都是发起请求需要的认证和token。
"container_format": "bare",
"disk_format": "qcow2",
"name": "centos",
"visibility": "public"
}
a=requests.post('http://192.168.100.10:9292/v2/images', headers=headers, json=data).json() #这里提交请求
headers["Content-Type"] = "application/octet-stream" #content-type需要修改,修改为二进制方式
#其他openstack不涉及文件调用时,都是默认为Application/json的方式
#请求头规范了我们请求内容,所以需要在请求头中声明我们的请求类型。
requests.put(f"http://192.168.100.10:9292{a['file']}", headers=headers, data=open("/www/CentOS_7.2_x86_64_XD.qcow2", 'rb')).status_code
print("创建成功") #这里真正提交镜像后面设置本地镜像路径
【api调用创建用户】
import requests
import json
import os
headers={"a":"b"}
data={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"] = requests.post('http://192.168.100.10:5000/v3/auth/tokens', headers=headers, json=data).headers["X-Subject-Token"]
data={
"user": {
"name": "sbzzy",
"password": "sbzzy",
"domain_id": "b20ce9996ba743deaa11b6130e432c20" #复制域id
}
}
requests.post('http://controller:35357/v3/users', headers=headers, json=data).json()
print("用户创建成功")
【api调用volume】
import requests
import json
import os
headers={"a":"b"}
data={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
"volume": {
"name": "iii",
"size": 5,
}
}
requests.post("http://controller:8776/v2/b57bd68bfccc495f834592987728df8a/volumes",headers=headers,json=data).json()
print("创建完成")
#这里无法使用http://controller:8776/v2/%(tenant_id)s,这里无法识别%(tenant_id)s,所以这里需要进入图形化界面,查看
这里实际的id为当前项目的id。
【api调用创建network】
import requests
import json
import os
headers={"a":"b"}
data={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
"network": {
"name": "aaa",
"shared": "true",
"provider:physical_network": "provider",
"provider:network_type": "flat",
}
}
requests.post("http://controller:9696/v2.0/networks",headers=headers,json=data).json()
print("创建成功")
创建子网
import requests
import json
import os
headers={"a":"b"}
data={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo",
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"]=requests.post("http://controller:35357/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
"subnet": {
"name": "wai-sub",
"cidr": "192.168.200.0/24",
"gateway_ip": "192.168.200.1",
"network_id": "f8b4eaa1-6020-47d0-b4ff-61251a33bc63", #提前获取网络的id
"ip_version": 4
}
}
requests.post("http://controller:9696/v2.0/subnets",headers=headers,json=data).json()
print("子网创建完成")
也可以同时创建网络和子网
headers={"a":"b"}
qwe={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo",
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"]=requests.post("http://controller:35357/v3/auth/tokens",headers=headers,json=qwe).headers["X-Subject-Token"]
data={
"network": {
"name": "wai",
"shared": "true",
"provider:network_type": "flat",
"provider:physical_network": "provider",
}
}
a=requests.post("http://controller:9696/v2.0/networks",headers=headers,json=data).json() #至此网络创建完毕
b=a['network']['id'] #这里赋值给b的是一个带有此网络信息的字典,这里将字典中的字典里的id值提取出来,也就是network_id。
print("网络创建成功")
data={
"subnet": {
"name": "wai-sub",
"cidr": "192.168.200.0/24",
"gateway_ip": "192.168.200.1",
"ip_version": "4"
}
}
data["subnet"]["network_id"]=str(b) #这里给上面写入data的字典中的字典添加network_id:[id]键值对,添加一创建网络的id,就不用自行复制了。
requests.post("http://controller:9696/v2.0/subnets",headers=headers,json=data).json()
print("^_^!!")
print("子网创建完成")
【创建实例】
import requests
import json
import os
headers={"a":"b"}
data={
"auth": {
"identity": {
"methods": ["password"],
"password": {
"user": {
"domain": {
"name": "demo"
},
"name": "admin",
"password": "000000"
}
}
},
"scope": {
"project": {
"domain": {
"name": "demo"
},
"name": "admin"
}
}
}
}
headers["X-Auth-Token"]=requests.post("http://controller:5000/v3/auth/tokens",headers=headers,json=data).headers["X-Subject-Token"]
data={
"server": {
"name": "server1",
"imageRef": "86a415e0-d7b0-48b7-82f2-423e8ce43fa9",
"flavorRef": "1",
"networks": [{"uuid": "ff66a808-d19e-488a-8c67-a55987ebc0b4"}] #不设置使用网段,则使用已有子网,如果已有多个子网,此选项为必须配置。
}
}
requests.post("http://controller:8774/v2.1/servers",headers=headers,json=data).json()
print("创建完成")

浙公网安备 33010602011771号