193 lines
10 KiB
Markdown
193 lines
10 KiB
Markdown
# 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 磁盘空间
|