docs: def _run_task_internal(self, task):
          ''' run a particular module step in a playbook '''
  
          hosts = self._list_available_hosts()
          self.inventory.restrict_to(hosts)
  
          runner = cirruscluster.ext.ansible.runner.Runner(
              pattern=task.play.hosts, inventory=self.inventory, module_name=task.module_name,
              module_args=task.module_args, forks=self.forks,
              remote_pass=self.remote_pass, module_path=self.module_path,
              timeout=self.timeout, remote_user=task.play.remote_user,
              remote_port=task.play.remote_port, module_vars=task.module_vars,
              private_key_file=self.private_key_file,
              private_key=self.private_key,
              setup_cache=self.SETUP_CACHE, basedir=task.play.basedir,
              conditional=task.only_if, callbacks=self.runner_callbacks,
              sudo=task.sudo, sudo_user=task.sudo_user,
              transport=task.transport, sudo_pass=task.sudo_pass, is_playbook=True
          )
  
          if task.async_seconds == 0:
              results = runner.run()
          else:
              results, poller = runner.run_async(task.async_seconds)
              self.stats.compute(results)
              if task.async_poll_interval > 0:
                  # if not polling, playbook requested fire and forget, so don't poll
                  results = self._async_poll(poller, task.async_seconds, task.async_poll_interval)
  
          contacted = results.get('contacted',{})
          dark      = results.get('dark', {})
  
          self.inventory.lift_restriction()
  
          if len(contacted.keys()) == 0 and len(dark.keys()) == 0:
              return None
  
          return results