From adbd73182b50a80ae6c80760133d61f164de27b1 Mon Sep 17 00:00:00 2001
From: ibuler <ibuler@qq.com>
Date: Fri, 22 Mar 2024 16:23:12 +0800
Subject: [PATCH] fix: ansible playbook render and run in localhost

---
 apps/assets/automations/base/manager.py         |  4 ++--
 apps/ops/ansible/runner.py                      | 17 ++++++++++++++++-
 .../automations/deploy_applet_host/__init__.py  |  4 ++--
 pyproject.toml                                  |  2 +-
 4 files changed, 21 insertions(+), 6 deletions(-)

diff --git a/apps/assets/automations/base/manager.py b/apps/assets/automations/base/manager.py
index 2a74243d0..98e8690f0 100644
--- a/apps/assets/automations/base/manager.py
+++ b/apps/assets/automations/base/manager.py
@@ -12,7 +12,7 @@ from sshtunnel import SSHTunnelForwarder
 
 from assets.automations.methods import platform_automation_methods
 from common.utils import get_logger, lazyproperty, is_openssh_format_key, ssh_pubkey_gen
-from ops.ansible import JMSInventory, PlaybookRunner, DefaultCallback
+from ops.ansible import JMSInventory, SuperPlaybookRunner, DefaultCallback
 
 logger = get_logger(__name__)
 
@@ -269,7 +269,7 @@ class BasePlaybookManager:
                 if not playbook_path:
                     continue
 
-                runer = PlaybookRunner(
+                runer = SuperPlaybookRunner(
                     inventory_path,
                     playbook_path,
                     self.runtime_dir,
diff --git a/apps/ops/ansible/runner.py b/apps/ops/ansible/runner.py
index c5fee5fd9..7dd40b390 100644
--- a/apps/ops/ansible/runner.py
+++ b/apps/ops/ansible/runner.py
@@ -1,6 +1,7 @@
 import os
-import uuid
 import shutil
+import uuid
+
 import ansible_runner
 from django.conf import settings
 from django.utils._os import safe_join
@@ -43,6 +44,9 @@ class AdHocRunner:
 
         if not os.path.exists(self.project_dir):
             os.mkdir(self.project_dir, 0o755)
+        private_env = safe_join(self.project_dir, 'env')
+        if os.path.exists(private_env):
+            shutil.rmtree(private_env)
 
         ansible_runner.run(
             timeout=self.timeout if self.timeout > 0 else None,
@@ -69,9 +73,13 @@ class PlaybookRunner:
         if not callback:
             callback = DefaultCallback()
         self.cb = callback
+        self.envs = {}
 
     def run(self, verbosity=0, **kwargs):
         verbosity = get_ansible_log_verbosity(verbosity)
+        private_env = safe_join(self.project_dir, 'env')
+        if os.path.exists(private_env):
+            shutil.rmtree(private_env)
 
         ansible_runner.run(
             private_data_dir=self.project_dir,
@@ -81,11 +89,18 @@ class PlaybookRunner:
             event_handler=self.cb.event_handler,
             status_handler=self.cb.status_handler,
             host_cwd=self.project_dir,
+            envvars=self.envs,
             **kwargs
         )
         return self.cb
 
 
+class SuperPlaybookRunner(PlaybookRunner):
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+        self.envs = {"LOCAL_CONNECTION_ENABLED": "1"}
+
+
 class UploadFileRunner:
     def __init__(self, inventory, job_id, dest_path, callback=None):
         self.id = uuid.uuid4()
diff --git a/apps/terminal/automations/deploy_applet_host/__init__.py b/apps/terminal/automations/deploy_applet_host/__init__.py
index c8e4d9e27..7c0d53d47 100644
--- a/apps/terminal/automations/deploy_applet_host/__init__.py
+++ b/apps/terminal/automations/deploy_applet_host/__init__.py
@@ -9,7 +9,7 @@ from django.utils import timezone
 
 from common.db.utils import safe_db_connection
 from common.utils import get_logger, random_string
-from ops.ansible import PlaybookRunner, JMSInventory
+from ops.ansible import SuperPlaybookRunner, JMSInventory
 from terminal.models import Applet, AppletHostDeployment
 
 logger = get_logger(__name__)
@@ -114,7 +114,7 @@ class DeployAppletHostManager:
     def _run_playbook(self, generate_playbook: callable, **kwargs):
         inventory = self.generate_inventory()
         playbook = generate_playbook()
-        runner = PlaybookRunner(
+        runner = SuperPlaybookRunner(
             inventory=inventory, playbook=playbook, project_dir=self.run_dir
         )
         return runner.run(**kwargs)
diff --git a/pyproject.toml b/pyproject.toml
index e0d084724..70f7bb75d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -11,7 +11,7 @@ python = "^3.11"
 cython = "3.0.0"
 aiofiles = "23.1.0"
 amqp = "5.1.1"
-ansible-core = { url = "https://github.com/jumpserver/ansible/releases/download/v2.14.1.2/ansible-2.14.1.2.zip" }
+ansible-core = { url = "https://github.com/jumpserver/ansible/archive/refs/tags/v2.14.1.4.zip" }
 ansible = "7.1.0"
 ansible-runner = "2.3.3"
 asn1crypto = "1.5.1"