专栏首页老安的博客vmware api开发之克隆虚拟机

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()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

扫码关注云+社区

领取腾讯云代金券