
运维机器人听起来是个新东西——其实就是把 DeepSeek 的对话能力和微信的消息接口接起来让运维人员不用半夜爬起来看服务器。但不是直接接个 API 就完了要解决三个问题哪些运维命令能让机器人执行、哪些不能机器人的回答要不要带执行结果多个运维群的指令会不会串。一、能做什么和不能做什么先划边界运维机器人适合做两类事状态查询类帮我查一下订单服务的内存占用、数据库主从延迟多少、定时巡检类每天早上 9 点把三台机器的 CPU 使用率汇总推到群里。不适合直接接命令执行——帮我重启一下订单服务这种指令不能让机器人直接执行风险太高。做法是机器人收到执行类指令后转人工或者走审批流程不做全自动执行。二、安全沙箱只允许白名单指令机器人能调用的运维接口必须是白名单里的不在白名单里的一律拒答。白名单里每一条命令都要配好调用方式、参数校验和返回格式。比如查内存调哪个接口、传什么参数、返回结果取哪个字段。白名单可以做成配置文件加新命令不用改代码。三、回答格式运维人员要一眼看懂运维场景的回答不是你好呀那种要能直接用于排查。推荐格式服务名 指标 当前值 阈值 是否异常。比如订单服务 内存占用 68% 阈值 80% 正常。异常的标红用 emoji 或 markdown 格式。四、指令解析从自然语言到白名单命令用户说的是帮我查一下订单服务的内存机器人要把这句话解析成白名单里的某个命令和参数。做法是给每条白名单命令配一组触发关键词和参数提取规则用简单的正则就能覆盖大部分场景复杂的再让 DeepSeek 来兜底理解。运维机器人架构对照组件作用关键点常见坑指令解析自然语言→命令参数关键词正则DeepSeek 兜底解析错命令白名单允许的运维接口配置化参数校验执行类命令放开沙箱执行安全调接口独立进程超时卡死整个服务回答格式化运维可读输出服务指标值阈值自然语言太模糊核心实现import re, subprocess, time class OpsBot: def __init__(self, api, model, whitelist): self.api api self.model model self.whitelist whitelist # {check_memory: {}} self.worker None # 沙箱进程 def parse(self, text): # 1. 正则匹配触发词 for cmd, cfg in self.whitelist.items(): for kw in cfg[keywords]: if kw in text: args self._extract_args(text, cfg[pattern]) return cmd, args # 2. DeepSeek 兜底理解 system 把用户需求解析成运维命令返回 JSON: {cmd, args} raw self.model.chat([ {role: system, content: system}, {role: user, content: text} ]) try: return json.loads(raw) except: return None, {} def _extract_args(self, text, pattern): m re.search(pattern, text) return m.groupdict() if m else {} def execute(self, cmd, args): # 沙箱执行子进程超时 cfg self.whitelist.get(cmd) if not cfg: return None proc subprocess.Popen( cfg[cmd_template].format(**args), shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.PIPE) try: out, err proc.communicate(timeoutcfg.get(timeout, 10)) return out.decode() except subprocess.TimeoutExpired: proc.kill(); return 超时 def format(self, cmd, result): # 运维可读格式服务 指标 值 是否异常 try: data json.loads(result) metric data.get(metric, ) value data.get(value, ) threshold data.get(threshold, ) abnormal data.get(value, 0) data.get(threshold, 999) tag ⚠️异常 if abnormal else ✅正常 return f{tag} {cmd} {metric} {value} (阈值 {threshold}) except: return result # 兜底原样返回 def handle(self, event): cmd, args self.parse(event[content]) if not cmd: return self.api.reply(event, 这个请求我处理不了) # 执行类命令一律转人工 if cmd in self.WHITLIST_EXECUTE: return self.api.reply(event, 执行类操作请找人工) result self.execute(cmd, args) reply self.format(cmd, result or ) time.sleep(3) self.api.reply(event, reply[:500])落地建议先划边界——状态查询和定时巡检可以做命令执行一律转人工或审批。可调用的运维接口必须白名单化不在白名单的一律拒答白名单做成配置文件加新命令不改代码。指令解析先正则关键词匹配兜底让模型理解别全靠模型容易解析错。回答格式固定成服务指标值阈值是否异常运维一眼看懂。微信侧的消息接口由Eyun这类个人微信API平台 提供运维命令和沙箱在自建服务实现具体字段以平台开发文档为准。