def handle(self, *args, **options): hostname = options.get('hostname') if not hostname: raise CommandError("--hostname is a required argument") try: path = tempfile.mkdtemp(prefix='awx_isolated_ssh', dir=settings.AWX_PROOT_BASE_PATH) args = [ 'ansible', 'all', '-i', '{},'.format(hostname), '-u', settings.AWX_ISOLATED_USERNAME, '-T5', '-m', 'shell', '-a', 'ansible-runner --version', '-vvv' ] if all([ getattr(settings, 'AWX_ISOLATED_KEY_GENERATION', False) is True, getattr(settings, 'AWX_ISOLATED_PRIVATE_KEY', None) ]): ssh_key_path = os.path.join(path, '.isolated') ssh_auth_sock = os.path.join(path, 'ssh_auth.sock') run.open_fifo_write(ssh_key_path, settings.AWX_ISOLATED_PRIVATE_KEY) args = run.wrap_args_with_ssh_agent(args, ssh_key_path, ssh_auth_sock) try: print(' '.join(args)) subprocess.check_call(args) except subprocess.CalledProcessError as e: sys.exit(e.returncode) finally: shutil.rmtree(path)
def run_pexpect(cls, pexpect_args, *args, **kw): isolated_ssh_path = None try: if all([ getattr(settings, 'AWX_ISOLATED_KEY_GENERATION', False) is True, getattr(settings, 'AWX_ISOLATED_PRIVATE_KEY', None) ]): isolated_ssh_path = tempfile.mkdtemp(prefix='awx_isolated', dir=settings.AWX_PROOT_BASE_PATH) os.chmod(isolated_ssh_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR) isolated_key = os.path.join(isolated_ssh_path, '.isolated') ssh_sock = os.path.join(isolated_ssh_path, '.isolated_ssh_auth.sock') run.open_fifo_write(isolated_key, settings.AWX_ISOLATED_PRIVATE_KEY) pexpect_args = run.wrap_args_with_ssh_agent(pexpect_args, isolated_key, ssh_sock, silence_ssh_add=True) return run.run_pexpect(pexpect_args, *args, **kw) finally: if isolated_ssh_path: shutil.rmtree(isolated_ssh_path)