def _get_vm(self): vms = [] if self.uuid: if self.use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.uuid, vm_id_type="instance_uuid") else: vm_obj = find_vm_by_id(self.content, vm_id=self.uuid, vm_id_type="uuid") if vm_obj is None: self.module.fail_json(msg="Failed to find the virtual machine with UUID : %s" % self.uuid) vms = [vm_obj] elif self.name: objects = self.get_managed_objects_properties(vim_type=vim.VirtualMachine, properties=['name']) for temp_vm_object in objects: if temp_vm_object.obj.name == self.name: vms.append(temp_vm_object.obj) elif self.moid: vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.module.params['moid'], self.si._stub) if vm_obj: vms.append(vm_obj) if vms: if self.params.get('name_match') == 'first': self.vm = vms[0] elif self.params.get('name_match') == 'last': self.vm = vms[-1] else: self.module.fail_json(msg="Failed to find virtual machine using %s" % (self.name or self.uuid))
def get_vm(self): """ Find unique virtual machine either by UUID or Name. Returns: virtual machine object if found, else None. """ vms = [] if self.vm_uuid: if not self.use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.params['vm_uuid'], vm_id_type="uuid") elif self.use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.params['vm_uuid'], vm_id_type="instance_uuid") vms = [vm_obj] elif self.vm_name: objects = self.get_managed_objects_properties(vim_type=vim.VirtualMachine, properties=['name']) for temp_vm_object in objects: if len(temp_vm_object.propSet) != 1: continue if temp_vm_object.obj.name == self.vm_name: vms.append(temp_vm_object.obj) break elif self.moid: vm_obj = VmomiSupport.templateOf('VirtualMachine')(self.moid, self.si._stub) if vm_obj: vms.append(vm_obj) if len(vms) > 1: self.module.fail_json(msg="Multiple virtual machines with same name %s found." " Please specify vm_uuid instead of vm_name." % self.vm_name) self.vm = vms[0]
def getvm_folder_paths(self): results = [] vms = [] if self.uuid: if self.use_instance_uuid: vm_obj = find_vm_by_id(self.content, vm_id=self.uuid, vm_id_type="instance_uuid") else: vm_obj = find_vm_by_id(self.content, vm_id=self.uuid, vm_id_type="uuid") if vm_obj is None: self.module.fail_json( msg="Failed to find the virtual machine with UUID : %s" % self.uuid) vms = [vm_obj] elif self.name: objects = self.get_managed_objects_properties( vim_type=vim.VirtualMachine, properties=['name']) for temp_vm_object in objects: if temp_vm_object.obj.name == self.name: vms.append(temp_vm_object.obj) for vm in vms: folder_path = self.get_vm_path(self.content, vm) results.append(folder_path) return results
def main(): argument_spec = vmware_argument_spec() argument_spec.update(dict(datacenter=dict(default=None, type='str'), cluster=dict(default=None, type='str'), folder=dict(type='str', default='/vm'), vm_id=dict(required=True, type='str'), vm_id_type=dict(default='vm_name', type='str', choices=['inventory_path', 'uuid', 'dns_name', 'vm_name']), vm_username=dict(required=False, type='str'), vm_password=dict(required=False, type='str', no_log=True), vm_shell=dict(required=True, type='str'), vm_shell_args=dict(default=" ", type='str'), vm_shell_env=dict(default=None, type='list'), vm_shell_cwd=dict(default=None, type='str'))) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=False, required_if=[['vm_id_type', 'inventory_path', ['folder']]], ) if not HAS_PYVMOMI: module.fail_json(changed=False, msg='pyvmomi is required for this module') try: p = module.params datacenter_name = p['datacenter'] cluster_name = p['cluster'] folder = p['folder'] content = connect_to_api(module) datacenter = None if datacenter_name: datacenter = find_datacenter_by_name(content, datacenter_name) if not datacenter: module.fail_json(changed=False, msg="datacenter not found") cluster = None if cluster_name: cluster = find_cluster_by_name(content, cluster_name, datacenter) if not cluster: module.fail_json(changed=False, msg="cluster not found") if p['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(content, vm_id=p['vm_id'], vm_id_type="inventory_path", folder=folder) else: vm = find_vm_by_id(content, vm_id=p['vm_id'], vm_id_type=p['vm_id_type'], datacenter=datacenter, cluster=cluster) if not vm: module.fail_json(msg='VM not found') msg = execute_command(content, vm, p['vm_username'], p['vm_password'], p['vm_shell'], p['vm_shell_args'], p['vm_shell_env'], p['vm_shell_cwd']) module.exit_json(changed=True, uuid=vm.summary.config.uuid, msg=msg) except vmodl.RuntimeFault as runtime_fault: module.fail_json(changed=False, msg=runtime_fault.msg) except vmodl.MethodFault as method_fault: module.fail_json(changed=False, msg=method_fault.msg) except Exception as e: module.fail_json(changed=False, msg=str(e))
def __init__(self, module): super(VMwareShellManager, self).__init__(module) datacenter_name = module.params['datacenter'] cluster_name = module.params['cluster'] folder = module.params['folder'] self.pm = self.content.guestOperationsManager.processManager self.timeout = self.params.get('timeout', 3600) self.wait_for_pid = self.params.get('wait_for_process', False) datacenter = None if datacenter_name: datacenter = find_datacenter_by_name(self.content, datacenter_name) if not datacenter: module.fail_json( changed=False, msg="Unable to find %(datacenter)s datacenter" % module.params) cluster = None if cluster_name: cluster = find_cluster_by_name(self.content, cluster_name, datacenter) if not cluster: module.fail_json(changed=False, msg="Unable to find %(cluster)s cluster" % module.params) if module.params['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type="inventory_path", folder=folder) else: vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type=module.params['vm_id_type'], datacenter=datacenter, cluster=cluster) if not vm: module.fail_json(msg='Unable to find virtual machine.') tools_status = vm.guest.toolsStatus if tools_status in ['toolsNotInstalled', 'toolsNotRunning']: self.module.fail_json( msg= "VMwareTools is not installed or is not running in the guest." " VMware Tools are necessary to run this module.") try: self.execute_command(vm, module.params) except vmodl.RuntimeFault as runtime_fault: module.fail_json(changed=False, msg=to_native(runtime_fault.msg)) except vmodl.MethodFault as method_fault: module.fail_json(changed=False, msg=to_native(method_fault.msg)) except Exception as e: module.fail_json(changed=False, msg=to_native(e))
def getvm(self, name=None, uuid=None, folder=None): vm = None match_first = False if uuid: vm = find_vm_by_id(self.content, vm_id=uuid, vm_id_type="uuid") elif folder and name: if self.params['name_match'] == 'first': match_first = True vm = find_vm_by_id(self.content, vm_id=name, vm_id_type="inventory_path", folder=folder, match_first=match_first) return vm
def getvm(self, name=None, uuid=None, folder=None): vm = None match_first = False if uuid: vm = find_vm_by_id(self.content, vm_id=uuid, vm_id_type="uuid") elif folder and name: if self.params['name_match'] == 'first': match_first = True vm = find_vm_by_id(self.content, vm_id=name, vm_id_type="inventory_path", folder=folder, match_first=match_first) return vm
def __init__(self, module): super(VmwareGuestFileManager, self).__init__(module) datacenter_name = module.params['datacenter'] cluster_name = module.params['cluster'] folder = module.params['folder'] datacenter = None if datacenter_name: datacenter = find_datacenter_by_name(self.content, datacenter_name) if not datacenter: module.fail_json( msg="Unable to find %(datacenter)s datacenter" % module.params) cluster = None if cluster_name: cluster = find_cluster_by_name(self.content, cluster_name, datacenter) if not cluster: module.fail_json(msg="Unable to find %(cluster)s cluster" % module.params) if module.params['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type="inventory_path", folder=folder) else: vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type=module.params['vm_id_type'], datacenter=datacenter, cluster=cluster) if not vm: module.fail_json(msg='Unable to find virtual machine.') self.vm = vm try: result = dict(changed=False) if module.params['directory']: result = self.directory() if module.params['copy']: result = self.copy() if module.params['fetch']: result = self.fetch() module.exit_json(**result) except vmodl.RuntimeFault as runtime_fault: module.fail_json(msg=to_native(runtime_fault.msg)) except vmodl.MethodFault as method_fault: module.fail_json(msg=to_native(method_fault.msg)) except Exception as e: module.fail_json(msg=to_native(e))
def __set_vm_obj_list(self, vm_list=None, cluster_obj=None): """ Function pupulate vm object list from list of vms Args: vm_list: List of vm names Returns: None """ if vm_list is None: vm_list = self.__vm_list if cluster_obj is None: cluster_obj = self.__cluster_obj if vm_list is not None: for vm in vm_list: if self.module.check_mode is False: # Get host data vm_obj = find_vm_by_id(content=self.content, vm_id=vm, vm_id_type='vm_name', cluster=cluster_obj) if vm_obj is None: raise Exception("VM %s does not exist in cluster %s" % (vm, self.__cluster_name)) self.__vm_obj_list.append(vm_obj)
def getvm(self, name=None, uuid=None, folder=None): vm = None if uuid: vm = find_vm_by_id(self.content, vm_id=uuid, vm_id_type="uuid") elif folder: # Build the absolute folder path to pass into the search method if not self.params['folder'].startswith('/'): self.module.fail_json(msg="Folder %(folder)s needs to be an absolute path, starting with '/'." % self.params) searchpath = '%(datacenter)s%(folder)s' % self.params # get all objects for this path ... f_obj = self.content.searchIndex.FindByInventoryPath(searchpath) if f_obj: if isinstance(f_obj, vim.Datacenter): f_obj = f_obj.vmFolder for c_obj in f_obj.childEntity: if not isinstance(c_obj, vim.VirtualMachine): continue if c_obj.name == name: vm = c_obj if self.params['name_match'] == 'first': break return vm
def __init__(self, module): super(VmwareGuestFileManager, self).__init__(module) datacenter_name = module.params['datacenter'] cluster_name = module.params['cluster'] folder = module.params['folder'] datacenter = None if datacenter_name: datacenter = find_datacenter_by_name(self.content, datacenter_name) if not datacenter: module.fail_json(msg="Unable to find %(datacenter)s datacenter" % module.params) cluster = None if cluster_name: cluster = find_cluster_by_name(self.content, cluster_name, datacenter) if not cluster: module.fail_json(msg="Unable to find %(cluster)s cluster" % module.params) if module.params['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type="inventory_path", folder=folder) else: vm = find_vm_by_id(self.content, vm_id=module.params['vm_id'], vm_id_type=module.params['vm_id_type'], datacenter=datacenter, cluster=cluster) if not vm: module.fail_json(msg='Unable to find virtual machine.') self.vm = vm try: result = dict(changed=False) if module.params['directory']: result = self.directory() if module.params['copy']: result = self.copy() if module.params['fetch']: result = self.fetch() module.exit_json(**result) except vmodl.RuntimeFault as runtime_fault: module.fail_json(msg=to_native(runtime_fault.msg)) except vmodl.MethodFault as method_fault: module.fail_json(msg=to_native(method_fault.msg)) except Exception as e: module.fail_json(msg=to_native(e))
def getvm(self, name=None, uuid=None, folder=None): vm = None if uuid: vm = find_vm_by_id(self.content, vm_id=uuid, vm_id_type="uuid") elif folder: searchpath = '%(folder)s' % self.params # get all objects for this path ... f_obj = self.content.searchIndex.FindByInventoryPath(searchpath) if f_obj: if isinstance(f_obj, vim.Datacenter): f_obj = f_obj.vmFolder for c_obj in f_obj.childEntity: if not isinstance(c_obj, vim.VirtualMachine): continue if c_obj.name == name: vm = c_obj if self.params['name_match'] == 'first': break return vm
def get_all_vms_info(self, vms_list=None): """ Function to get all VM objects using name from given cluster Args: vms_list: List of VM names Returns: List of VM managed objects """ vm_obj_list = [] if vms_list is None: vms_list = self.vm_list for vm_name in vms_list: vm_obj = find_vm_by_id(content=self.content, vm_id=vm_name, vm_id_type='vm_name', cluster=self.cluster_obj) if vm_obj is None: self.module.fail_json(msg="Failed to find the virtual machine %s " "in given cluster %s" % (vm_name, self.cluster_name)) vm_obj_list.append(vm_obj) return vm_obj_list
def main(): argument_spec = vmware_argument_spec() argument_spec.update(dict(datacenter=dict(type='str'), cluster=dict(type='str'), folder=dict(type='str'), vm_id=dict(type='str', required=True), vm_id_type=dict(default='vm_name', type='str', choices=['inventory_path', 'uuid', 'dns_name', 'vm_name']), vm_username=dict(type='str', required=True), vm_password=dict(type='str', no_log=True, required=True), directory=dict( type='dict', default=None, options=dict( path=dict(required=True, type='str'), operation=dict(required=True, type='str', choices=['create', 'delete']), recurse=dict(required=False, type='bool', default=False) )), copy=dict( type='dict', default=None, options=dict( src=dict(required=True, type='str'), dest=dict(required=True, type='str'), overwrite=dict(required=False, type='bool', default=False) )), fetch=dict( type='dict', default=None, options=dict(src=dict(required=True, type='str'), dest=dict(required=True, type='str'), )) )) module = AnsibleModule(argument_spec=argument_spec, supports_check_mode=False, required_if=[['vm_id_type', 'inventory_path', ['folder']]], mutually_exclusive=[['directory', 'copy', 'fetch']], required_one_of=[['directory', 'copy', 'fetch']], ) if not HAS_PYVMOMI: module.fail_json(msg='pyvmomi is required for this module') if module.params['vm_id_type'] == 'inventory_path' and not module.params['folder']: module.fail_json(msg='Folder is required parameter when vm_id_type is inventory_path') datacenter_name = module.params['datacenter'] cluster_name = module.params['cluster'] folder = module.params['folder'] content = connect_to_api(module) datacenter = None if datacenter_name: datacenter = find_datacenter_by_name(content, datacenter_name) if not datacenter: module.fail_json(msg="Unable to find %(datacenter)s datacenter" % module.params) cluster = None if cluster_name: cluster = find_cluster_by_name(content, cluster_name, datacenter) if not cluster: module.fail_json(msg="Unable to find %(cluster)s cluster" % module.params) if module.params['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(content, vm_id=module.params['vm_id'], vm_id_type="inventory_path", folder=folder) else: vm = find_vm_by_id(content, vm_id=module.params['vm_id'], vm_id_type=module.params['vm_id_type'], datacenter=datacenter, cluster=cluster) if not vm: module.fail_json(msg='Unable to find virtual machine.') try: if module.params['directory']: result = directory(module, content, vm) if module.params['copy']: result = copy(module, content, vm) if module.params['fetch']: result = fetch(module, content, vm) module.exit_json(**result) except vmodl.RuntimeFault as runtime_fault: module.fail_json(msg=runtime_fault.msg) except vmodl.MethodFault as method_fault: module.fail_json(msg=method_fault.msg) except Exception as e: module.fail_json(msg=to_native(e))
def execute(self): result = dict(changed=False) check_count = 0 # search for vm datacenter = None if self.datacenter_name: datacenter = find_datacenter_by_name(self.content, self.datacenter_name) if not datacenter: self.module.fail_json( changed=False, msg="Unable to find %(datacenter)s datacenter" % self.module.params) cluster = None if self.cluster_name: cluster = find_cluster_by_name(self.content, self.cluster_name, self.datacenter) if not cluster: self.module.fail_json( changed=False, msg="Unable to find %(cluster)s cluster" % self.module.params) if self.module.params['vm_id_type'] == 'inventory_path': vm = find_vm_by_id(self.content, vm_id=self.module.params['vm_id'], vm_id_type="inventory_path", folder=self.folder) else: vm = find_vm_by_id(self.content, vm_id=self.module.params['vm_id'], vm_id_type=self.module.params['vm_id_type'], datacenter=datacenter, cluster=cluster) if (vm): guest_auth = vim.vm.guest.NamePasswordAuthentication() guest_auth.username = self.vm_username guest_auth.password = self.vm_password while True: try: r = self.content.guestOperationsManager.processManager.ListProcessesInGuest( vm=vm, auth=guest_auth) except Exception as e: self.module.fail_json(msg=str(e)) pid_num = [ x for x in r if (re.search( r'%s.*%s' % (self.vm_shell, self.vm_shell_args), x.cmdLine)) ] if (pid_num): exitCode = pid_num.pop().exitCode if (isinstance(exitCode, int)): if (exitCode == 0): self.module.exit_json(**result) else: self.module.fail_json(msg="Processing failed") if (self.time_out): check_count += 1 if (check_count == self.time_out): self.module.fail_json( msg="Processing was not completed within the time") time.sleep(self.check_interval) else: self.module.fail_json(msg="Unable to find virtual machine")