公司要自己开发私有云管理平台,我这边负责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 异步后台任务)等
第二个介绍展示html5的虚拟机console
只适用于vc ,5.x 不适用于6.x,6.x改了登陆验证方式 暂时还没搞定
过程,收到前端请求的,找到对应虚拟机,生成sessionTicket和 thumbprint,
拼接对应的网址,当作一个 HttpResponseRedirect 返回前端
先上下效果
输入 http://10.20.11.4:8001/viewconsole.py?IP=10.20.13.158
代码如下
import atexit
import ssl
import sys
import time
import OpenSSL
import os
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
from django.http import HttpResponse
from django.http import HttpResponseRedirect
def viewconsole(request):
vmip = request.GET.get('IP')
respone=main(vmip)
return HttpResponseRedirect(a)
return HttpResponse(a)
def get_vm(content, name): 实例化虚拟机
vm = None
container = content.viewManager.CreateContainerView(
content.rootFolder, [vim.VirtualMachine], True)
for c in container.view:
if c.name == name:
vm = c
break
return vm
def main(vmip):
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()
vm = get_vm(content, "{0}".format(vmip))
vm_moid = vm._moId
vcenter_data = content.setting
vcenter_settings = vcenter_data.setting
console_port = '7331'
for item in vcenter_settings:
key = getattr(item, 'key')
if key == 'VirtualCenter.FQDN':
vcenter_fqdn = getattr(item, 'value')
session_manager = content.sessionManager
session = session_manager.AcquireCloneTicket()
vc_cert = ssl.get_server_certificate(("vc的ip",443))
vc_pem = OpenSSL.crypto.load_certificate(OpenSSL.crypto.FILETYPE_PEM,
vc_cert)
vc_fingerprint = vc_pem.digest('sha1')
url="http://vc的ip:7331/console/?vmId={2}&vmName={3}&host={4}&sessionTicket={5}&thumbprint={6}".format("",console_port,vm_moid,vmip,vcenter_fqdn,session,vc_fingerprint.decode())
return url