前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vmware api开发之克隆虚拟机

vmware api开发之克隆虚拟机

作者头像
用户1057912
发布2018-07-06 18:16:49
1.4K0
发布2018-07-06 18:16:49
举报
文章被收录于专栏:老安的博客老安的博客

公司要自己开发私有云管理平台,我这边负责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()
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-06-28 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档