Python运维开发:基于OpenStack Restful API实现镜像上传
Python运维开发:基于OpenStack Restful API实现镜像上传[1分]
使用OpenStack all-in-one镜像,创建OpenStack Python运维开发环境。云主机的用户/密码为:“root/Abc@1234”,OpenStack的域名/账号/密码为:“demo/admin/000000”。
提示说明:python脚本文件头建议加入“#encoding:utf-8”避免编码错误;测试脚本代码用python3命令执行与测试。
在controller节点的/root目录下创建api_image_manager.py脚本,编写python代码对接OpenStack API,完成镜像的创建与上传。创建之前查询是否存在“同名镜像”,如果存在先删除该镜像。
(1)创建镜像:要求在OpenStack私有云平台中上传镜像cirros-0.3.4-x86_64-disk.img,名字为cirros001,disk_format为qcow2,container_format为bare。
(2)查询镜像:查询cirros001的详细信息,并以json格式文本输出到控制台。
完成后提交OpenStack Python运维开发环境Controller节点的IP地址,用户名和密码提交。
import requests
# token建议api方式获取
token = 'gAAAAABlAu0wSauTOn5ueaCFD7B4g7oMdo5zDxKiPhgzibdSsetUUpgaMNxZZHZzxD_MDVu96HXcdesCFM2X1oXtExB217pxocN2fRFRXLq3XyB2UrhFYVWkdg2TefBeGc-HKdEdFbfTvuK0wo04VtdQ6SSILwycAitKxNZvkAaabHv2V1u4VI4'
head = {
'Content-Type': 'application/json',
'X-Auth-Token': token}
resp = requests.get('http://controller:9292/v2/images', headers=head)
print(resp.text)
print('IMAGES LIST')
for im_name in resp.json()['images']:
if im_name['name'] == 'cirros001':
resp = requests.delete(f'http://controller:9292/v2/images/{im_name["id"]}', headers=head)
print(resp.text)
print('DELETE IMAGES')
resp = requests.post('http://controller:9292/v2/images', json={
"container_format": "bare",
"disk_format": "qcow2",
"name": "cirros001",
}, headers=head)
print(resp.text)
print('CREATE IMAGES')
image_id = resp.json()['id']
print(image_id)
head['Content-Type'] = 'application/octet-stream'
with open('cirros-0.3.4-x86_64-disk.img','rb') as f:
resp = requests.put(f'http://controller:9292/v2/images/{image_id}/file', headers=head, data=f.read())
print(resp.text)
resp = requests.get(f'http://controller:9292/v2/images/{image_id}', headers=head)
print(resp.text)