1具体可查阅api文档https://vdc-download.vmware.com/vmwb-repository/dcr-public/6b586ed2-655c-49d9-9029-bc416323cb22/fa0b429a-a695-4c11-b7d2-2cbc284049dc/doc/index.html# coding: utf-8 2import sys 3import ssl 4import requests 5import traceback 6import urllib 7import json 8 9 10Result = '' 11 12 13def derypt_passwd(data): 14 master = os.getenv('ANT_BASEURL').strip() 15 url = "{}/daemon/api/v2/encryption/decrypt?encrypted_text={}".format(master.rstrip('/'), urllib.quote(data)) 16 res = requests.get(url) 17 return res.content 18 19 20class CheckError(Exception): 21 pass 22 23 24class CloneError(Exception): 25 pass 26 27 28try: 29 from pyVmomi import vim 30 from pyVim.connect import SmartConnect, Disconnect 31 import atexit 32except ImportError: 33 Result = '执行主机上不存在pyVmomi,无法进行后续操作' 34 print Result 35 sys.exit(1) 36 37 38def wait_for_task(task): 39 """ wait for a vCenter task to finish """ 40 global Result 41 task_done = False 42 while not task_done: 43 if task.info.state == 'success': 44 return task.info.result 45 if task.info.state == 'error': 46 raise CloneError(task.info.error) 47 48 49def get_obj(content, vimtype, name): 50 """ 51 根据name返回对象。 52 如果name为空,则返回发现的第一个值;若无任何值,返回None 53 """ 54 obj = None 55 container = content.viewManager.CreateContainerView( 56 content.rootFolder, vimtype, True) 57 for v in container.view: 58 if name: 59 if v.name == name: 60 obj = v 61 break 62 else: 63 obj = v 64 break 65 return obj 66 67def get_vcenter_info(vcenter): 68 vcenter = json.loads(vcenter)[0] 69 print vcenter 70 host = vcenter['ip'] 71 port = int(vcenter['discoveryPort']) 72 user = vcenter['username'] 73 password = vcenter['password'] 74 if '>>>' in password: 75 password = derypt_passwd(password) 76 virtual_datacenter = vcenter['name'] 77 return user, password, host, port, virtual_datacenter 78 79def get_value(data, key=None): 80 if data and data not in ('[{}]'): 81 data = json.loads(data) 82 if isinstance(data, str): 83 return data 84 elif isinstance(data[0], dict): 85 if key: 86 return data[0][key] 87 for k, v in data[0].items(): 88 return v 89 90def clone_vm(content, template, vm_name, 91 datacenter_name=None, vm_folder=None, datastore_name=None, 92 cluster_name=None, resource_pool_name=None, power_on=True, 93 vm_ip=None, vm_subnetmask=None, vm_gateway=None, vm_domain=None, 94 vm_hostname=None): 95 """ 96 从模板/虚拟机来克隆虚拟机。 97 数据中心名称,目标虚拟机文件夹,数据存储名称, 98 集群名称,资源池,是否自动开机均为可选项 99 """ 100 datacenter = get_obj(content, [vim.Datacenter], datacenter_name) 101 102 if vm_folder: 103 destfolder = get_obj(content, [vim.Folder], vm_folder) 104 if not destfolder: 105 raise CheckError('虚拟机目录:{}不存在'.format(vm_folder)) 106 else: 107 destfolder = datacenter.vmFolder 108 if not destfolder: 109 raise CheckError('默认虚拟机目录为空') 110 111 if datastore_name: 112 datastore = get_obj(content, [vim.Datastore], datastore_name) 113 if not datastore: 114 raise CheckError('数据存储:{}不存在'.format(datastore_name)) 115 else: 116 datastore = get_obj( 117 content, [vim.Datastore], template.datastore[0].info.name) 118 if not datastore: 119 raise CheckError('默认数据存储为空') 120 121 if resource_pool_name: 122 resource_pool = get_obj(content, [vim.ResourcePool], resource_pool_name) 123 if not resource_pool: 124 raise CheckError('资源池:{}不存在'.format(resource_pool_name)) 125 else: 126 cluster = get_obj(content, [vim.ClusterComputeResource], cluster_name) 127 if cluster: 128 resource_pool = cluster.resourcePool 129 else: 130 resource_pool = get_obj(content, [vim.ResourcePool], None) 131 if not resource_pool: 132 raise CheckError('默认资源池为空') 133 134 relospec = vim.vm.RelocateSpec() 135 relospec.datastore = datastore 136 relospec.pool = resource_pool 137 138 clonespec = vim.vm.CloneSpec() 139 clonespec.location = relospec 140 clonespec.powerOn = power_on 141 if all([vm_ip, vm_subnetmask, vm_gateway, vm_domain]): 142 clonespec.customization = get_customspec(vm_ip, vm_subnetmask, vm_gateway, vm_domain, vm_hostname) 143 elif any([vm_ip, vm_subnetmask, vm_gateway, vm_domain]): 144 raise CheckError('虚拟机的IP、子网掩码、网关、DNS域必须同时提供') 145 146 print '开始克隆虚拟机' 147 task = template.Clone(folder=destfolder, name=vm_name, spec=clonespec) 148 wait_for_task(task) 149 150 151def get_customspec(vm_ip=None, vm_subnetmask=None, vm_gateway=None, 152 vm_domain=None, vm_hostname=None): 153 # guest NIC settings 154 adaptermaps = [] 155 guest_map = vim.vm.customization.AdapterMapping() 156 guest_map.adapter = vim.vm.customization.IPSettings() 157 guest_map.adapter.ip = vim.vm.customization.FixedIp() 158 guest_map.adapter.ip.ipAddress = vm_ip 159 guest_map.adapter.subnetMask = vm_subnetmask 160 guest_map.adapter.gateway = vm_gateway 161 guest_map.adapter.dnsDomain = vm_domain 162 adaptermaps.append(guest_map) 163 164 # DNS settings 165 globalip = vim.vm.customization.GlobalIPSettings() 166 globalip.dnsServerList = [vm_gateway] 167 globalip.dnsSuffixList = vm_domain 168 169 # Hostname settings 170 ident = vim.vm.customization.LinuxPrep() 171 ident.domain = vm_domain 172 ident.hostName = vim.vm.customization.FixedName() 173 if vm_hostname: 174 ident.hostName.name=vm_hostname 175 #ident.hostName.name = vm_hostname 176 customspec = vim.vm.customization.Specification() 177 customspec.nicSettingMap = adaptermaps 178 customspec.globalIPSettings = globalip 179 customspec.identity = ident 180 return customspec 181 182 183if __name__ == '__main__': 184 try: 185 ssl._create_default_https_context = ssl._create_unverified_context 186 requests.packages.urllib3.disable_warnings() 187 188 print cluster_name, template_name, vm_folder, datastore_name, resource_pool, vCenter 189 cluster_name = get_value(cluster_name, key='name') 190 template_name = get_value(template_name, key='name') 191 vm_folder = get_value(vm_folder, key='name') 192 193 datastore_name = get_value(datastore_name, key='name') 194 resource_pool = get_value(resource_pool, key='name') 195 196 print cluster_name, template_name, vm_folder, datastore_name, resource_pool 197 198 power_on = True if power_on == 'true' else False 199 cpu_num = int(cpu_num) if cpu_num else None 200 memory = int(memory) if memory else None 201 202 user, passwd, host, port, virtual_datacenter_name = get_vcenter_info(vCenter) 203 204 print user, passwd, host, port, virtual_datacenter_name 205 206 context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 207 si = SmartConnect(host=host, 208 user=user, 209 pwd=passwd, 210 port=port, 211 sslContext=context) 212 atexit.register(Disconnect, si) 213 214 215 content = si.RetrieveContent() 216 template = get_obj(content, [vim.VirtualMachine], template_name) 217 vm_hostname=vm_name.replace('_','') 218 vm_folder='' 219 if template: 220 clone_vm(content, template, vm_name, 221 virtual_datacenter_name, vm_folder, datastore_name, 222 cluster_name, resource_pool, power_on, 223 vm_ip, vm_subnet_mask, vm_gateway, 224 vm_domain, vm_hostname) 225 else: 226 raise CheckError('模板:{}不存在'.format(template_name)) 227 Result = '克隆虚拟机成功' 228 print Result 229 sys.exit(0) 230 except Exception as e: 231 print e 232 print traceback.format_exc() 233 Result = '克隆虚拟机失败' 234 print Result 235 sys.exit(1)
获取虚拟机信息
1import ssl 2import pysphere 3import json 4from pysphere import VIServer,MORTypes,VIProperty 5from pysphere.resources import VimService_services as VI 6 7def derypt_passwd(data): 8 master = os.getenv('ANT_BASEURL').strip() 9 url = "{}/daemon/api/v2/encryption/decrypt?encrypted_text={}".format(master.rstrip('/'), urllib.quote(data)) 10 res = requests.get(url) 11 return res.content 12 13 14def get_vcenter_info(vcenter): 15 vcenter = json.loads(vcenter)[0] 16 #print vcenter 17 host = vcenter['ip'] 18 port = int(vcenter['discoveryPort']) 19 user = vcenter['username'] 20 password = vcenter['password'] 21 if '>>>' in password: 22 password = derypt_passwd(password) 23 virtual_datacenter = vcenter['name'] 24 return user, password, host, port, virtual_datacenter 25 26 27ssl._create_default_https_context = ssl._create_unverified_context 28user, passwd, host, port, virtual_datacenter_name = get_vcenter_info(vCenter) 29 30s = VIServer() 31s.connect(host,user,passwd) 32 33vm1 = s.get_vm_by_name(vm_name) 34vm_info = vm1.get_properties() 35print vm_info 36ip_address = vm_info.get('ip_address')