Python调用Openstack API
获取token值(除了身份认证,还可以用openstack token issue + awk 命令得到,或直接写死 [1小时生效] )
vim create_image.py
import json #调用json模块
import requests #调用requests模块
headers = {"Content-Type": "application/json"} #将请求的数据转换为json格式上传,可以将上传的数据直接以json格式上传,可以请求成功
body = {
"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=body).headers["X-Subject-Token"] #这里设置镜像信息,上面都是发起请求需要的认证和token。
import os #(可以不用os库调用密钥)
headers["X-Auth-Token"] = os.popen("source /etc/keystone/admin-openrc.sh && openstack token issue | awk '/ id/{print $4}'").read().strip('\n')
headers["X-Auth-Token"] = os.popen("source /etc/keystone/admin-openrc.sh && openstack token issue | sed -n '/ id/s/|.*| //p'").read().strip('\n')
data = {
"container_format": "bare",
"disk_format": "qcow2",
"name": "centos7.5",
"visibility": "public"
}
request = 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的方式
print(requests.put(f"http://192.168.100.10:9292{request['file']}", headers=headers, data=open("/opt/iaas/images/CentOS_7.5_x86_64_XD.qcow2", 'rb')).status_code)#请求头规范了我们请求内容,所以需要在请求头中声明我们的请求类型
print('云主机镜像上传成功')
python3 create_image.py
204
云主机镜像上传成功