#!/usr/bin/env python3 # -*- coding: utf-8 """在 207 部署 K3s + Docker GitLab + Argo CD 演示环境。 Windows 执行: python scripts_cursor/00_部署_workbuddy到207.py python scripts_cursor/基础设施_Argo_CD_原理与部署教程/argocd_01_207部署演示.py 207 上也可直接: bash /opt/workbuddy/patches_cursor/基础设施_Argo_CD_原理与部署教程/install_207_demo.sh """ from __future__ import annotations import sys import time from pathlib import Path import paramiko _HERE = Path(__file__).resolve().parent _ROOT = _HERE.parents[1] if str(_ROOT / "scripts_cursor") not in sys.path: sys.path.insert(0, str(_ROOT / "scripts_cursor")) import _config as C HOST = "192.168.110.207" USER = "root" PASS = "123456" REMOTE = f"{C.WORKBUDDY_ROOT}/patches_cursor/基础设施_Argo_CD_原理与部署教程" DEMO_ROOT = "/opt/argocd-demo" def ssh() -> paramiko.SSHClient: c = paramiko.SSHClient() c.set_missing_host_key_policy(paramiko.AutoAddPolicy()) c.connect(HOST, username=USER, password=PASS, timeout=30) return c def run(client: paramiko.SSHClient, cmd: str, timeout: int = 7200) -> tuple[int, str, str]: print(f"\n>>> {cmd[:200]}") _, stdout, stderr = client.exec_command(cmd, timeout=timeout, get_pty=True) out = stdout.read().decode(errors="replace") err = stderr.read().decode(errors="replace") code = stdout.channel.recv_exit_status() if out.strip(): print(out[-8000:] if len(out) > 8000 else out) if err.strip() and code != 0: print("STDERR:", err[-4000:]) return code, out, err def upload_tree(sftp: paramiko.SFTPClient, local: Path, remote: str) -> None: for p in sorted(local.rglob("*")): rel = p.relative_to(local).as_posix() rpath = f"{remote}/{rel}" if rel != "." else remote if p.is_dir(): try: sftp.mkdir(rpath) except OSError: pass else: sftp.put(str(p), rpath) def main() -> int: local_patch = _ROOT / "patches_cursor" / "基础设施_Argo_CD_原理与部署教程" if not local_patch.is_dir(): print("[FAIL] 本地 patches 不存在:", local_patch) return 1 client = ssh() sftp = client.open_sftp() run(client, f"mkdir -p {REMOTE} {DEMO_ROOT}/manifests-src") upload_tree(sftp, local_patch, REMOTE) # Git 仓只含 demo-nginx;Application YAML 单独放到 DEMO_ROOT run(client, f"rm -rf {DEMO_ROOT}/manifests-src/demo-nginx && mkdir -p {DEMO_ROOT}/manifests-src && cp -a {REMOTE}/manifests/demo-nginx {DEMO_ROOT}/manifests-src/") run(client, f"cp -f {REMOTE}/manifests/argocd-application-demo-nginx.yaml {DEMO_ROOT}/argocd-application-demo-nginx.yaml") run(client, f"chmod +x {REMOTE}/install_207_demo.sh") sftp.close() print("[INFO] 开始远程安装(k3s 用国内镜像;GitLab 经 daocloud 代理拉取)…") run(client, "pkill -f 'get.k3s.io|k3s-install|curl -o /tmp/k3s' || true", timeout=30) # pipefail:避免 tee 掩盖 install.sh 失败码 code, out, _ = run( client, f"bash -c 'set -o pipefail; bash {REMOTE}/install_207_demo.sh 2>&1 | tee {DEMO_ROOT}/install.log; exit ${{PIPESTATUS[0]}}'", timeout=7200, ) client.close() if code != 0: print(f"[FAIL] 安装退出码 {code},见 207:{DEMO_ROOT}/install.log") return code print("[PASS] 207 Argo CD 演示环境就绪") return 0 if __name__ == "__main__": raise SystemExit(main())