公司要自己開發私有雲管理平台,我這邊負責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