def _run(self, *module_args, **complex_args): """Execute an ansible adhoc command returning the results in a AdHocResult object.""" # Assemble module argument string if True: module_args = ' '.join(module_args) else: if module_args: complex_args.update(dict(_raw_params=' '.join(module_args))) # Assert hosts matching the provided pattern exist hosts = self.options['inventory_manager'].list_hosts() no_hosts = False if len(hosts) == 0: no_hosts = True warnings.warn( "provided hosts list is empty, only localhost is available") self.options['inventory_manager'].subset(self.options.get('subset')) hosts = self.options['inventory_manager'].list_hosts( self.options['host_pattern']) if len(hosts) == 0 and not no_hosts: raise ansible.errors.AnsibleError( "Specified hosts and/or --limit does not match any hosts") # Log the module and parameters log.debug("[%s] %s: %s" % (self.options['host_pattern'], self.options['module_name'], complex_args)) # Build module runner object kwargs = dict( inventory=self.options.get('inventory_manager'), pattern=self.options.get('host_pattern'), module_name=self.options.get('module_name'), module_args=module_args, complex_args=complex_args, transport=self.options.get('connection'), remote_user=self.options.get('user'), module_path=self.options.get('module_path'), become=self.options.get('become'), become_method=self.options.get('become_method'), become_user=self.options.get('become_user'), ) # Run the module runner = Runner(**kwargs) results = runner.run() # Log the results log.debug(results) if 'dark' in results and results['dark']: raise AnsibleConnectionFailure("Host unreachable", dark=results['dark'], contacted=results['contacted']) # Success! return AdHocResult(contacted=results['contacted'])
def _run(self, *module_args, **complex_args): """Execute an ansible adhoc command returning the result in a AdhocResult object.""" # Assemble module argument string if module_args: complex_args.update(dict(_raw_params=' '.join(module_args))) # Assert hosts matching the provided pattern exist hosts = self.options['inventory_manager'].list_hosts() no_hosts = False if len(hosts) == 0: no_hosts = True warnings.warn( "provided hosts list is empty, only localhost is available") self.options['inventory_manager'].subset(self.options.get('subset')) hosts = self.options['inventory_manager'].list_hosts( self.options['host_pattern']) if len(hosts) == 0 and not no_hosts: raise ansible.errors.AnsibleError( "Specified hosts and/or --limit does not match any hosts") # Log the module and parameters log.debug("[%s] %s: %s" % (self.options['host_pattern'], self.options['module_name'], complex_args)) # Pass along cli options args = ['pytest-ansible', '-vvvvv', self.options['host_pattern']] for argument in ('connection', 'user', 'become', 'become_method', 'become_user', 'module_path'): arg_value = self.options.get(argument) argument = argument.replace('_', '-') if arg_value in (None, False): continue if arg_value is True: args.append('--{0}'.format(argument)) else: args.append('--{0}={1}'.format(argument, arg_value)) # Use Ansible's own adhoc cli to parse the fake command line we created and then save it # into Ansible's global context adhoc = AdHocCLI(args) adhoc.parse() # And now we'll never speak of this again del adhoc # Initialize callback to capture module JSON responses cb = ResultAccumulator() kwargs = dict( inventory=self.options['inventory_manager'], variable_manager=self.options['variable_manager'], loader=self.options['loader'], stdout_callback=cb, passwords=dict(conn_pass=None, become_pass=None), ) # create a pseudo-play to execute the specified module via a single task play_ds = dict(name="pytest-ansible", hosts=self.options['host_pattern'], become=self.options['become'], become_user=self.options['become_user'], gather_facts='no', tasks=[ dict(action=dict(module=self.options['module_name'], args=complex_args), ), ]) log.debug("Play(%s)", play_ds) play = Play().load(play_ds, variable_manager=self.options['variable_manager'], loader=self.options['loader']) # now create a task queue manager to execute the play tqm = None try: log.debug("TaskQueueManager(%s)", kwargs) tqm = TaskQueueManager(**kwargs) tqm.run(play) finally: if tqm: tqm.cleanup() # Log the results log.debug(cb.results) # Raise exception if host(s) unreachable # FIXME - if multiple hosts were involved, should an exception be raised? if cb.unreachable: raise AnsibleConnectionFailure("Host unreachable", dark=cb.unreachable, contacted=cb.contacted) # Success! return AdHocResult(contacted=cb.contacted)
def _run(self, *module_args, **complex_args): """Execute an ansible adhoc command returning the result in a AdhocResult object.""" # Assemble module argument string if module_args: complex_args.update(dict(_raw_params=' '.join(module_args))) # Assert hosts matching the provided pattern exist hosts = self.options['inventory_manager'].list_hosts() no_hosts = False if len(hosts) == 0: no_hosts = True warnings.warn("provided hosts list is empty, only localhost is available") self.options['inventory_manager'].subset(self.options.get('subset')) hosts = self.options['inventory_manager'].list_hosts(self.options['host_pattern']) if len(hosts) == 0 and not no_hosts: raise ansible.errors.AnsibleError("Specified hosts and/or --limit does not match any hosts") # Log the module and parameters log.debug("[%s] %s: %s" % (self.options['host_pattern'], self.options['module_name'], complex_args)) parser = CLI.base_parser( runas_opts=True, inventory_opts=True, async_opts=True, output_opts=True, connect_opts=True, check_opts=True, runtask_opts=True, vault_opts=True, fork_opts=True, module_opts=True, ) (options, args) = parser.parse_args([]) # Pass along cli options options.verbosity = 5 options.connection = self.options.get('connection') options.remote_user = self.options.get('user') options.become = self.options.get('become') options.become_method = self.options.get('become_method') options.become_user = self.options.get('become_user') options.module_path = self.options.get('module_path') # Initialize callback to capture module JSON responses cb = ResultAccumulator() kwargs = dict( inventory=self.options['inventory_manager'], variable_manager=self.options['variable_manager'], loader=self.options['loader'], options=options, stdout_callback=cb, passwords=dict(conn_pass=None, become_pass=None), ) # create a pseudo-play to execute the specified module via a single task play_ds = dict( name="pytest-ansible", hosts=self.options['host_pattern'], gather_facts='no', tasks=[ dict( action=dict( module=self.options['module_name'], args=complex_args ), ), ] ) log.debug("Play(%s)", play_ds) play = Play().load(play_ds, variable_manager=self.options['variable_manager'], loader=self.options['loader']) # now create a task queue manager to execute the play tqm = None try: log.debug("TaskQueueManager(%s)", kwargs) tqm = TaskQueueManager(**kwargs) tqm.run(play) finally: if tqm: tqm.cleanup() # Log the results log.debug(cb.results) # Raise exception if host(s) unreachable # FIXME - if multiple hosts were involved, should an exception be raised? if cb.unreachable: raise AnsibleConnectionFailure( self.get_unreachable_msg(cb.unreachable), dark=cb.unreachable, contacted=cb.contacted ) # Success! return AdHocResult(contacted=cb.contacted)