Files

193 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# JumpServer Web CLI 自动化部署工具集
## 概述
通过 JumpServer Luna Web 终端的浏览器自动化(Playwright),实现在目标服务器上自动执行命令行操作、文件上传下载等自动化部署、测试、维护能力。
## 核心架构
```
┌──────────────────────────────────────────────────────────────┐
│ 本地 (Windows/PowerShell) │
│ ┌─────────────────┐ ┌──────────────────────────────────┐ │
│ │ gen-deploy-*.py │──▶│ 生成 base64 编码的命令 + 载荷 │ │
│ │ gen-single-shot │ │ 输出到 webcli_*.sh │ │
│ └─────────────────┘ └──────────┬───────────────────────┘ │
│ │ │
│ ┌────────────────────────────────▼───────────────────────┐ │
│ │ jumpserver_webcli_v7.py │ │
│ │ Playwright 浏览器自动化 │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ 1. 打开 JumpServer URL │ │ │
│ │ │ 2. 自动登录 (密码 + OTP) │ │ │
│ │ │ 3. 导航到目标资产 (10.90.5.110) │ │ │
│ │ │ 4. 在 Web 终端中执行命令 │ │ │
│ │ │ 5. 截图 + 保存输出 │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └───────────────────────┬───────────────────────────────┘ │
└──────────────────────────┼──────────────────────────────────┘
│ HTTPS
┌──────────────────────────▼──────────────────────────────────┐
│ JumpServer (jumpserver.dc.servyou-it.com) │
│ Luna Web Terminal ──▶ 税友集团 ──▶ hz-oa-ai-g-dataquery │
│ │ │
│ 10.90.5.110 │
│ ┌──────────┐ │
│ │ Docker │ │
│ │ wecom_it │ │
│ │ _backend │ │
│ └──────────┘ │
└──────────────────────────────────────────────────────────────┘
```
## 核心文件清单
### 本地命令生成器(项目内)
| 文件 | 用途 |
|------|------|
| `deploy-staging/gen-deploy-commands.py` | 生成分步部署命令(Part A/B) |
| `deploy-staging/gen-single-shot.py` | 生成单次执行命令 |
| `deploy-staging/gen-deploy-commands-bash.py` | Bash 版本生成器 |
| `deploy-staging/hotfix-*/webcli_*.sh` | 生成的 Web CLI 命令脚本 |
| `deploy-staging/hotfix-*/run_v7_*.py` | Playwright 自动化编排脚本 |
| `deploy-staging/hotfix-120-qrcode-auto-confirm/upload_chunks_sftp.py` | SFTP 分块上传 |
### Web CLI 自动化引擎(用户技能目录)
| 文件 | 用途 |
|------|------|
| `~/.workbuddy/skills/jumpserver-automation/scripts/jumpserver_webcli_v7.py` | **当前主力**Playwright Web CLI 自动化 |
| `~/.workbuddy/skills/jumpserver-automation/scripts/probe_xterm_buffer_v2.py` | **xterm.js 缓冲区探测**5 种方法测试结构化输出捕获 |
| `~/.workbuddy/skills/jumpserver-automation/scripts/jumpserver_webcli_v6.py` | v6 版本(支持超时等待) |
| `~/.workbuddy/skills/jumpserver-automation/scripts/jumpserver_webcli_v5.py` | v5 版本 |
| `~/.workbuddy/skills/jumpserver-automation/scripts/jumpserver_webcli_probe.py` | 初始探测脚本 |
| `~/.workbuddy/skills/jumpserver-automation/scripts/jumpserver_config.py` | 跳板机配置 |
### 部署命令示例(各 hotfix 目录)
| 目录 | 用途 |
|------|------|
| `deploy-staging/hotfix-116-qrcode-scan-get/` | 扫码获取热修复(v1-v4 webcli |
| `deploy-staging/hotfix-120-qrcode-auto-confirm/` | 扫码自动确认热修复(v5 webcli,含 SFTP |
| `deploy-staging/hotfix-48-nginx-upstream/` | Nginx upstream 修复 |
| `deploy-staging/hotfix-sso-enabled/` | SSO 启用热修复 |
## 技术演进历史
### 演进路线
```
v1-v6: SSH/plink 直接连接
├─ v1-v7: Paramiko SSH 库 (Python)
│ └─ 问题:堡垒机菜单导航不可靠,认证流程复杂
├─ v8-v10: plink.exe (PuTTY CLI)
│ └─ 问题:输出捕获不稳定,中文编码问题
├─ v11-v16: wexpect (Windows expect)
│ └─ 问题:交互式菜单匹配不稳定,超时控制困难
└─ 所有 SSH 方法共同问题:
├─ 双因素认证(密码+OTP)流程脆弱
├─ 堡垒机菜单导航需要精确的 expect 匹配
└─ 网络不稳定时重连复杂
v7+: Web CLI (Playwright 浏览器自动化) ✅ 当前方案
├─ webcli_probe: 探测 JumpServer Luna 终端的 Web 结构
├─ webcli_v1-v3: 基本登录 + 命令执行
├─ webcli_v4-v5: 增加 OTP 自动填充、截图验证
├─ webcli_v6: 增加超时等待、错误重试
└─ webcli_v7: 当前生产版本
优势:
├─ 绕过 SSH 认证复杂性,直接操作浏览器
├─ 可视化确认执行结果(截图)
├─ 支持长命令输入(>10KB base64 载荷)
├─ SFTP 文件上传(set_input_files
└─ 稳定的 OTP 自动填充
v17 (开发中): SSH Key 认证
└─ generate_ssh_keys.py + jumpserver_auto_v17_key_auth.py
目标:完全自动化,无需浏览器
状态:概念验证阶段
API 方式(探索中)
└─ create_connection_token.py, test_connection_token.py
目标:通过 JumpServer API 获取 WebSocket token
状态:API 可用但 Koko 终端协议未完全理解
```
### 关键经验教训
1. **不要走 SSH 直接连接路径**JumpServer 的堡垒机菜单 + OTP 双重认证使得 SSH 自动化极其脆弱。Web CLI 通过浏览器绕过这些问题。
2. **base64 编码大文件传输**:单次 Web CLI 输入约 10-15KB 安全上限。超过需分块(chunk_a 到 chunk_h),每块 ~3-4KB base64。
3. **分阶段执行**:部署应分 Part 1(文件传输)+ Part 2(部署执行)+ Part 3(验证),每阶段独立运行,便于定位问题。
4. **OTP 双回车问题**:发送 OTP 验证码后,某些情况下需要按 2 次回车才能触发验证流程(`test_double_enter.py` 记录了此发现)。
5. **编码一致性**:所有 .sh 文件必须 UTF-8 编码(`webcli_v3_cmd.utf8.sh`),否则 Web CLI 终端可能乱码。
6. **等待策略**Docker 操作后必须 `sleep 8` 以上等待容器重启,否则 `docker ps` 和 curl 验证会失败。
## 使用流程
### 标准部署流程
```powershell
# 1. 生成部署命令
cd deploy-staging
python gen-deploy-commands.py # 生成 part_a.txt / part_b.txt
# 2. (可选) 生成 webcli shell 脚本
python gen-single-shot.py # 生成 single_shot_cmd.txt
# 3. 通过 Playwright Web CLI 执行
cd C:\Users\simon\.workbuddy\skills\jumpserver-automation\scripts
python jumpserver_webcli_v7.py -c (Get-Content D:\...\webcli_v5_cmd.sh -Raw)
```
### 文件上传流程(SFTP 模式)
```powershell
# 使用 webcli_v7 的 SFTP 功能上传
python upload_chunks_sftp.py
# 自动将 chunk_a 到 chunk_h 上传到 /tmp/qrcode_v5/
```
## 部署命令生成器说明
### gen-deploy-commands.py
- **功能**:读取本地 shell 脚本,base64 编码后嵌入 Web CLI 命令
- **输入**`hotfix-qrcode-step5.sh` + `backend/app/config.py`
- **输出**`/tmp/deploy-step5/part_a.txt` + `part_b.txt`
- **Part A**:写文件 + 执行部署脚本(前台等待结果)
- **Part B**:查看执行日志 + curl 验证
### gen-single-shot.py
- **功能**:将所有操作合并为单条命令(用 `;` 连接)
- **优势**:一次粘贴,无需分步操作
- **限制**:命令总长度受 Web CLI 输入框限制(~20KB
## 任务清单(待办)
### P0 - 紧急
- [x] xterm.js 输出捕获分析 + probe_v2 探测脚本(2026-06-25
- [ ] 运行 probe_xterm_buffer_v2.py 确认缓冲区访问方式
- [ ] 实现 webcli_v8.py(结构化缓冲区读取,替代截图验证)
- [ ] 将 jumpserver_webcli_v7.py 路径从硬编码改为项目相对路径
- [ ] 创建 webcli 健康检查脚本(检测 JumpServer 页面是否可访问)
### P1 - 重要
- [ ] 封装 deploy-webcli 为独立 Python 包(pip install
- [ ] 实现 Web CLI 命令队列(批量执行 + 结果收集)
- [ ] 集成 OTP 自动获取到 webcli_v7(当前需手动获取)
- [ ] 迁移 gen-deploy-commands.py 中的硬编码路径到项目根路径
### P2 - 改进
- [ ] SSH Key 认证方案验证(v17
- [ ] JumpServer API Token 方式探索
- [ ] Web CLI 执行结果自动解析(正则提取 exit code)
- [ ] 告警集成:部署失败时企微通知
### 已知问题
- [ ] `deploy-server/` 目录未迁移(含部署包和 docker-compose>500MB
- [ ] plink.exe 依赖 Windows 环境(无法跨平台)
- [ ] webcli_v7 需要 Chrome/Chromium 浏览器
- [ ] Playwright 浏览器实例需要 ~500MB 磁盘空间