PyVmomi Clone_VM with CustomizaitonSpec

调用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)

 

posted @ 2017-09-03 13:59  Vincen_shen  阅读(1673)  评论(0编辑  收藏  举报