天天看點

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)

        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)

        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