开发者社区> 科技小能手> 正文

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



本文转自 superbigsea 51CTO博客,原文链接:http://blog.51cto.com/superbigsea/1793760

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
你也可以玩转Skype -- 基于Skype API开发外壳程序入门
原文: 你也可以玩转Skype -- 基于Skype API开发外壳程序入门 Skype是目前这个星球上最厉害的IM+VOIP软件,Skype现在已经改变了全球2.8亿人的生活方式。
1046 0
安卓开发_浅谈ListView(ArrayAdapter数组适配器)
列表视图(ListView)以垂直的形式列出需要显示的列表项。   实现过程:新建适配器->添加数据源到适配器->视图加载适配器   在安卓中,有两种方法可以在屏幕中添加列表视图 1、直接用ListView组件创建 2、让Activity继承ListActivity实现   一、xm...
865 0
PHP开发API接口注意事项
1、单文件实现多接口的形式有很多种,例如:if..elseif.. 或 switch 或 动态方法 (也就是TP的这种访问函数体的形式) 2、对于数据的输出最好用json,json具有相当强大的跨平台性,市场上各大主流编程语言都支持json解析,json正在逐步取代xml,成为网络数据的通用格式 阿里云代金券1000元免费领取地址:https://promotion.
1231 0
23705
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载