VMWare 的核心VCenter提供了针对Python的开发接口-pySphere.由于Python能够在Windows/Linux平台良好运行,所以选择Python能够实现更多的平台适应性。上一篇讲过如何使用PowerShell管理VCenter,其实使用Python来管理的具体做法也是大同小异,尤其体现在函数调用上。
需要说明的是:
1.使用pySphere必须安装python环境(推荐2.7环境,3.4环境由于语法不同,在安装的时候会大量报错)
2.pySphere连接vcenter的方式是使用https形式的ssl连接,最好先安装vcenter的加密证书,否则会报错(certificate validation failed)
3.如果安装证书后还报错,那么在代码import之后,加一句:ssl._create_default_https_context = ssl._create_unverified_context 这句话的作用是设置ssl不验证
下面是我整合的一个针对VCenter管理的一个类,实现了大部分的功能,还在继续完善中,提供源代码出来,欢迎补充。
''' @Created on 2015-7-24 @author: Justin ''' import os import os.path import time import socket import sys import string import ssl import base64 from pysphere import VIServer from pysphere import VIException, VIApiException, FaultTypes #import esxi_exception #to resolve the ssl problem #import ssl ssl._create_default_https_context = ssl._create_unverified_context #Server Control class VCenterManagement: server_ip = '' user_name = '' password = '' connect_flag = False server = None #vm_list = [] #def __init__(self): #Use the given args to connect the esxi server you want #@ip[string]: ESXi server's IP address #@name[string]: the username used to login the ESXi server #@pwd[string]: the password used to login the ESXi server def connect_server(self, ip, name, pwd): self.server_ip = ip self.user_name = name self.password = pwd self.server = VIServer() self.server.connect(self.server_ip, self.user_name, self.password) self.connect_flag = self.server.is_connected() if self.connect_flag: return True return False #To get all the definition registered vms from the connected server #@param[string]: can be set as ALL, POWER_ON, POWER_OFF, SUSPENDED #According to the param, returns a list of VM Paths. You might also filter by datacenter, #cluster, or resource pool by providing their name or MORs. #if cluster is set, datacenter is ignored, and if resource pool is set #both, datacenter and cluster are ignored. def get_registered_vms(self, param, status=None, datacenter=None, cluster=None, resource_pool=None): if param not in ['ALL', 'POWER_ON', 'POWER_OFF', 'SUSPENDED']: print "Get VMs error: param can only be set as ALL, POWER_ON, POWER_OFF, or SUSPENDED." return None if self.connect_flag == False: print "Get VMs error: Server not connected." return None if param == 'ALL': return self.server.get_registered_vms(datacenter, cluster, resource_pool) elif param == 'POWER_ON': return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='poweredOn') elif param == 'POWER_OFF': return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='poweredOff') elif param == 'SUSPENDED': return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='suspended') else: return None #Disconnect to the Server def disconnect(self): if self.connect_flag == True: self.server = self.server.disconnect() self.connect_flag == False #To keep session alive def keep_session_alive(self): assert self.server.keep_session_alive() #To get the server type def get_server_type(self): return self.server.get_server_type() #To get performance manager def get_performance_manager(self): return self.server.get_performance_manager() #To get the all the server's hosts def get_all_hosts(self): """ Returns a dictionary of the existing hosts keys are their names and values their ManagedObjectReference object. """ return self.server.get_hosts() #To get all datastores def get_all_datastores(self): """ Returns a dictionary of the existing datastores. Keys are ManagedObjectReference and values datastore names. """ return self.server.get_datastores() #To get all clusters def get_all_clusters(self): """ Returns a dictionary of the existing clusters. Keys are their ManagedObjectReference objects and values their names. """ return self.server.get_clusters() #To get all datacenters def get_all_datacenters(self): """ Returns a dictionary of the existing datacenters. keys are their ManagedObjectReference objects and values their names. """ return self.server.get_datacenters() #To get all resource pools def get_all_resource_pools(self): """ Returns a dictionary of the existing ResourcePools. keys are their ManagedObjectReference objects and values their full path names. """ return self.server.get_resource_pools() #To get hosts by name def get_hosts_by_name(self, from_mor): """ Returns a dictionary of the existing ResourcePools. keys are their ManagedObjectReference objects and values their full path names. @from_mor: if given, retrieves the hosts contained within the specified managed entity. """ try: hosts_dic = self.server.get_hosts(from_mor) except: print "Get hosts error!" return None return hosts_dic def get_vm_by_name(self,vm_name): try: vm = self.server.get_vm_by_name(vm_name) except: print "Get vm error!" return None return vm def power_on_vm(self,vm_name): try: vm = self.get_vm_by_name(vm_name) if(vm.is_powered_off()): vm.power_on() print "vm " + vm_name + " power on success." else: print "vm " + vm_name + "is already power on" return False except: print "Power on vm " + vm_name + "error" return False return True def power_off_vm(self,vm_name): try: vm = self.get_vm_by_name(vm_name) if(vm.is_powered_on()): vm.power_off() print "vm " + vm_name + " power off success." else: print "vm " + vm_name + "is already power off" return False except: print "Power off vm " + vm_name + " error" return False return True下面我写了一些测试
server = VCenterManagement() if(server.connect_server("135.251.34.48","administrator","asb#2345") == True): print "connected" else: print "connect fail" datacenters = server.get_all_datacenters() for k,v in datacenters.items(): print "key:" + k + ",value:" + str(v); clusters = server.get_all_clusters() for k,v in clusters.items(): print "key:" + k + ",value:" + str(v); v = server.get_vm_by_name("MyVM1") vms = server.get_registered_vms("ALL") #print vms.get_property("name") for vm in vms: print vm #server.power_off_vm("MyVM1") if(v.get_status() == "POWERED ON"): server.power_off_vm("MyVM1") else: server.power_on_vm("MyVM1") print v.get_property("name") print v.get_status() server.disconnect() print "server disconnected!"运行结果如下:
总结:Python脚本非常高效,开发效率也是非常高的,尤其在自动化方面,是非常好的帮手,熟悉python能够非常方便地开发一些服务器管理的功能。