vmware api开发之克隆虚拟机
公司要自己开发私有云管理平台,我这边负责vmware部分的后台接口编写。
主要基于vmware官方的 python 接口 pyvmomi进行二次封装,
主要实现有虚拟机开关机注销;
虚拟机增删磁盘;
虚拟机快照增删还原;
虚拟机 html5的console界面
虚拟机网络管理
zabbix 监控 esxi的磁盘使用率
zabbix 接受转发esxi的报警信息
我把 克隆虚拟机,虚拟机 html5的console界面,虚拟机快照管理 这几个代码的放出,水平有限,大神勿喷,并且有部分涉及隐私的地方做了处理,供大家参考下贴出的只是第一版,没有错误捕捉
需要环境:vcenter 5.1-6.0, python3.5 ,django 1.8 ,redis,mysql,celery(python 异步后台任务)等
首先介绍克隆虚拟机
流程 :前端发起请求,提交的参数有 源模板id,虚拟机的配置,后端提交请求到vcenter,提交成功的话,,给个反馈给前端,并在后台启用克隆虚拟机的进程,后台处理用,celery实现,虚拟机克隆完成后,虚拟os里面有个开机脚本来我的管理端注册下ip地址
代码如下
from pyVmomi import vim
from pyVim.connect import SmartConnect, Disconnect
from celery import Celery
from celery import platforms
import atexit
import argparse
import getpass
import ssl
import random
import cgi, cgitb
celery = Celery(‘tasks‘, broker=‘redis://:########redis连接信息/0‘)
platforms.C_FORCE_ROOT = True
def action(num,flavor,templateid): #主函数 被Celery调用
hardwareconfiglist={1:[2,8*1024],2:[4,16*1024],3:[8,32*1024]}
cpunum=hardwareconfiglist[int(flavor)][0]
memsize=hardwareconfiglist[int(flavor)][1]
si = None
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.verify_mode = ssl.CERT_NONE
si = SmartConnect(host="###########",
user="##################",
pwd="############",
port=443,
sslContext=context)
atexit.register(Disconnect, si)
content = si.RetrieveContent()
template = None
template = templates[str(templateid)]
template = get_obj(content, [vim.VirtualMachine], template)
for i in range(0,int(num)):
clone_vm(
content, template, si,
"", "",
"存储名字", ‘集群名字 ‘,
"", False,cpunum,memsize)
def get_obj(content, vimtype, name): #把克隆源的虚拟机实例化
obj = None
container = content.viewManager.CreateContainerView(
content.rootFolder, vimtype, True)
for c in container.view:
if name:
if c.name == name:
obj = c
break
else:
obj = c
break
return obj
def clone_vm( #克隆虚拟机,克隆出来的虚拟机名字是随机,
content, template, si,
datacenter_name, vm_folder, datastore_name,
cluster_name, resource_pool, power_on,cpunum,memsize):
datacenter = get_obj(content, [vim.Datacenter], datacenter_name)
if vm_folder:
destfolder = get_obj(content, [vim.Folder], vm_folder)
else:
destfolder = datacenter.vmFolder
if datastore_name:
datastore = get_obj(content, [vim.Datastore], datastore_name)
else:
datastore = get_obj(
content, [vim.Datastore], template.datastore[0].info.name)
# if None, get the first one
cluster = get_obj(content, [vim.ClusterComputeResource], cluster_name)
if resource_pool:
resource_pool = get_obj(content, [vim.ResourcePool], resource_pool)
else:
resource_pool = cluster.resourcePool
relospec = vim.vm.RelocateSpec()
relospec.datastore = datastore
relospec.pool = resource_pool
clonespec = vim.vm.CloneSpec()
clonespec.location = relospec
clonespec.powerOn = power_on
randomname=get_hostname()
task = template.Clone(folder=destfolder, name=randomname, spec=clonespec)
wait_for_task(task)
vm = get_obj(content, [vim.VirtualMachine], randomname)
spec = vim.vm.ConfigSpec()
spec.numCPUs=cpunum
spec.memoryMB=memsize
vm.ReconfigVM_Task(spec=spec) #设置克隆好的虚拟机的cpu 和 内存
vm.CreateSnapshot("fromstart","this created when it is been cloned by system",False,False) #克隆好了创建一个快照,以便实现重装系统的功能
vm.PowerOn()