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



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

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

相关文章
kafka-Java-SpringBoot-product API开发
前面讨论过如何安装kafka集群群及优化配置的问题,现在需要使用kafka集群,由于我们项目使用的是SpingBoot,故做一个inject到IOC容器的kafka-Java-SpringBoot-API,废话补多少,直接上代码:第一步,制定初始化类属性内容,最好赋初值,这样在使用的时候就不需要进行判空类:ProducerConfiguration import org.
1770 0
开发者学堂课程干货总结——Java 虚拟机原理(五)
Java 虚拟机原理课时1.5——Dragonwell特性:JWarmup。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!
67 0
开发者学堂课程干货总结——Java 虚拟机原理(六)
Java 虚拟机原理课时1.6——Dragonwell特性:Wisp。通过本节课的学习,能够掌握Java 虚拟机原理,学习JNI、类加载器原理、safepoint机制等知识。 电子书+视频为同学带来最佳学习效果,文字、课程链接、图谱地址统统为大家放送了哦!
72 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载