ChatOps
什么是 ChatOps
ChatOps 是将运维操作集成到聊天工具中的实践:通过在钉钉/Slack/飞书等群聊中发送命令,触发自动化运维操作。
核心价值
| 传统运维 | ChatOps |
|---|---|
| SSH 到服务器操作 | 群聊发命令 |
| 操作不可见 | 全员可见、可追溯 |
| 依赖个人经验 | 标准化命令 |
| 缺少审批流程 | 群内审批后执行 |
钉钉 Bot 示例
dingtalk_bot.py
from flask import Flask, request, jsonify
import subprocess
import hmac, hashlib, base64, time
app = Flask(__name__)
SECRET = "your-dingtalk-secret"
# 安全:只允许白名单命令
ALLOWED_COMMANDS = {
"/status": "systemctl status nginx",
"/disk": "df -h | head -10",
"/deploy": None, # 需要审批
}
@app.route("/webhook", methods=["POST"])
def webhook():
data = request.json
text = data.get("text", {}).get("content", "").strip()
if text not in ALLOWED_COMMANDS:
return jsonify({"msgtype": "text", "text": {"content": "未知命令"}})
cmd = ALLOWED_COMMANDS[text]
if cmd is None:
return jsonify({"msgtype": "text",
"text": {"content": f"⚠️ {text} 需要审批,请回复 /approve"}})
# 执行命令并返回结果
result = subprocess.run(cmd, shell=True, capture_output=True,
text=True, timeout=30)
output = result.stdout[:2000] or result.stderr[:2000]
return jsonify({"msgtype": "text", "text": {"content": output}})
危险
ChatOps Bot 必须严格限制可执行的命令(白名单),禁止任意命令注入。危险操作(部署、重启)应设置审批流程。
告警通知集成
alert_notify.py
import requests
import json
def send_dingtalk(webhook_url, title, content):
"""发送钉钉 Markdown 消息"""
data = {
"msgtype": "markdown",
"markdown": {
"title": title,
"text": content
}
}
requests.post(webhook_url, json=data, timeout=10)
# 调用示例
send_dingtalk(
"https://oapi.dingtalk.com/robot/send?access_token=xxx",
"🔴 服务告警",
"### CPU 使用率过高\n- **主机**: web-01\n- **CPU**: 95%\n- **时间**: 2024-01-15 10:30"
)
常见面试问题
Q1: ChatOps 的安全风险有哪些?如何防范?
答案:
- 命令注入:白名单命令 + 参数校验,禁止拼接用户输入到 shell 命令
- 权限控制:按用户/群组限制可执行命令,危险操作需双人审批
- 审计追踪:所有操作日志化,谁在什么时间执行了什么命令
- Webhook 安全:验证请求签名(钉钉/Slack 都支持),防止伪造请求
- 超时控制:命令执行设超时,防止阻塞