调用CustomizaitonSpec来Clone VM
''' Created on 2017-09-03 @author: Vincen ''' from pyVmomi import vim from pyVim.connect import SmartConnectNoSSL, Disconnect import atexit import time def wait_for_task(task, action_name='job', hide_result=False): """ Waits and provides updates on a vSphere task """ while task.info.state == vim.TaskInfo.State.running: print("%s is running" % action_name) time.sleep(2) if task.info.state == vim.TaskInfo.State.success: if task.info.result is not None and not hide_result: out = '%s completed successfully, result: %s' % (action_name, task.info.result) print(out) else: out = '%s completed successfully.' % action_name print(out) else: out = '%s did not complete successfully: %s' % (action_name, task.info.error) print(out) raise task.info.error # should be a Fault... check XXX # may not always be applicable, but can't hurt. return task.info.result def get_obj(content, vim_type, name): """ Return an object by name, if name is None the first found object is returned """ obj = None container = content.viewManager.CreateContainerView(content.rootFolder, vim_type, True) for c in container.view: if name: if c.name == name: obj = c break else: obj = c break return obj def connect_vc(host, user, pwd, port): si = SmartConnectNoSSL(host=host, user=user, pwd=pwd, port=port) # disconnect this thing atexit.register(Disconnect, si) return si.RetrieveContent() # This will connect us to vCenter # With this we are searching for the MOID of the VM to clone from def clone_vm(content, template_name, resource_pool, customization_spec_name, vm_name, vm_folder, datastore_name, cluster_name): template_vm = get_obj(content, [vim.VirtualMachine], template_name) # This gets the MOID of the Guest Customization Spec that is saved in the vCenter DB guest_customization_spec = content.customizationSpecManager.GetCustomizationSpec(name=customization_spec_name) # This will retrieve the Cluster MOID datastore = get_obj(content, [vim.Datastore], datastore_name) cluster = get_obj(content, [vim.ClusterComputeResource], cluster_name) if resource_pool: resource_pool = get_obj(content, [vim.ResourcePool], resource_pool) else: resource_pool = cluster.resourcePool relocate_spec = vim.vm.RelocateSpec() relocate_spec.datastore = datastore relocate_spec.pool = resource_pool # The folder of the new vm. dest_folder = get_obj(content, [vim.Folder], vm_folder) # This constructs the clone specification and adds the customization spec and location spec to it cloneSpec = vim.vm.CloneSpec(powerOn=True, template=False, location=relocate_spec, customization=guest_customization_spec.spec) # Finally this is the clone operation with the relevant specs attached clone = template_vm.Clone(name=vm_name, folder=dest_folder, spec=cloneSpec) wait_for_task(clone, "VM clone task") if __name__ == '__main__': username = 'administrator@vsphere.local' password = 'vmware' vcenter_ip = '172.16.65.99' vcenter_port = '443' cluster_name = 'BJ_Cluster' datastore_name = "SSD" template_name = 'Ubuntu16.04' customization_spec_name = 'Ubuntu_Customization' vm_name = 'Ubuntu08' vm_folder = "Linux" resource_pool = "" content = connect_vc(host=vcenter_ip, user=username, pwd=password, port=vcenter_port) clone_vm(content, template_name, resource_pool, customization_spec_name, vm_name, vm_folder, datastore_name, cluster_name)