一、独立标题 & 差异化定位
DevOps — 一站式自动化运维与基础设施管理平台 | 容器编排・CI/CD 流水线・主机监控・配置管理・多云协同・全链路自动化运维工作台
核心定位
集主机管理、容器服务、CI/CD 流水线、配置中心、日志审计、监控告警、多云资源编排于一体的全栈 DevOps 平台,面向研发、运维、测试团队,打通「代码提交→构建→测试→镜像打包→部署→监控→运维」全流程。深度适配前文 OpenClaw 工具生态,支持脚本联动、任务编排、批量调度,兼顾传统虚拟机、Docker、K8s、公有云 / 私有云混合架构,实现运维自动化、流程标准化、故障可视化、资源集约化。
独家改造特色(区别普通运维工具)
- 全架构统一纳管 同时支持物理机、虚拟机、Docker、Kubernetes、主流公有云资源统一管理,无需切换多套平台,单控制台完成全基础设施管控。
- 可视化 CI/CD 流水线 拖拽式流水线编排,支持多阶段、多分支、并行 / 串行任务、人工卡点、版本回滚;兼容 Git、SVN,一键完成编译、打包、镜像制作、环境部署。
- 批量运维 + 脚本引擎 内置远程执行引擎,支持批量主机命令、批量文件分发、定时任务、自定义脚本库,脚本可复用、版本归档、权限隔离,对接 OpenClaw 任务调度体系。
- 一体化监控告警 主机指标、容器指标、服务端口、日志、进程、接口状态全维度监控,多阈值告警、告警收敛、分级推送,故障自动定位、趋势分析。
- 配置中心 + 环境隔离 统一管理应用配置、环境变量、密钥、启动参数,开发 / 测试 / 预发 / 生产环境一键切换,配置热更新、版本追溯、灰度下发。
- 生态深度联动 可调用
Remotion生成运维报表视频、Wechat Article Search/WeChat MP CN推送运维告警、Financial Calculator Pro计算资源成本、Backtest Expert联动服务启停任务。 - 安全审计 + 权限体系 细粒度 RBAC 权限、操作日志全留存、命令审计、高危命令拦截、IP 白名单,满足企业合规要求。
- 离线私有化部署 完整离线运行,不依赖外网,支持单机 / 集群部署,轻量化设计,低配服务器也可稳定运行。
二、传统运维工具痛点
- ❌ 工具割裂:Git、Jenkins、Xshell、监控、配置中心各自独立,切换繁琐、流程断层
- ❌ 手动操作多:重复部署、批量运维靠手工,效率低、易出错、标准不统一
- ❌ 监控零散:指标、日志、告警分散,故障排查慢,无法全局观测
- ❌ 环境混乱:多环境配置杂乱,切换麻烦,配置泄露、版本混乱频发
- ❌ 无流程管控:上线无卡点、无回滚机制,线上故障风险高
- ❌ 生态孤立:无法和内部业务工具联动,难以实现全链路自动化
三、核心功能模块
1. 资源纳管模块
- 主机管理:Linux/Windows 远程连接、状态探测、资源信息(CPU / 内存 / 磁盘 / 网络)
- 容器管理:Docker 镜像、容器、仓库、生命周期管理;K8s 集群、节点、Pod、Service、Ingress 管控
- 多云管理:云服务器、负载均衡、对象存储、弹性伸缩统一视图
- 分组管理:按环境、业务、机房分组,批量操作、权限分组
2. CI/CD 流水线模块
- 代码仓库对接:GitLab/GitHub/Gitee/SVN 分支、标签、提交记录管理
- 流水线编排:可视化拖拽,构建、单元测试、镜像构建、推送仓库、部署、人工审核多阶段组合
- 制品管理:软件包、容器镜像版本管理、制品仓库对接
- 发布策略:常规发布、灰度发布、蓝绿发布、滚动发布、一键版本回滚
3. 批量运维 & 脚本中心
- 远程命令:单台 / 批量主机执行命令、实时输出、任务历史回放
- 文件分发:批量上传 / 下载、目录同步、权限配置
- 脚本库:自定义 Shell/Python 脚本、分类存储、版本管理、定时执行
- 任务调度:定时任务、周期任务、依赖任务、断点续跑
4. 统一配置中心
- 应用配置:键值对、配置文件、环境变量集中管理
- 环境隔离:开发 / 测试 / 预发 / 生产多环境独立配置,一键切换
- 配置下发:全量下发、灰度下发、热更新、配置回滚
- 密钥管理:敏感信息加密存储,权限隔离,防泄露
5. 全维度监控告警
- 主机监控:CPU、内存、磁盘、IO、网络、负载、进程状态
- 服务监控:端口、接口、健康检查、QPS、响应耗时、错误率
- 日志管理:日志采集、检索、关键词过滤、日志聚类、链路追踪
- 告警体系:多级别阈值、告警收敛、告警屏蔽、推送渠道(短信 / 企业微信 / 邮件 / Webhook)
6. 安全与审计
- RBAC 权限:用户、角色、菜单、操作权限细粒度管控
- 操作审计:所有操作、命令、配置变更全日志记录,可追溯
- 安全策略:高危命令拦截、IP 白名单、会话超时、传输加密
7. 生态对接模块
- 任务输出:运维任务、告警信息推送至全系列工具
- 报表生成:运维数据导出,对接 Remotion 制作动态报表视频
- 联动调度:接收外部指令,自动执行部署、启停、巡检等任务
四、项目目录结构
plaintext
devops/
├── config/ # 全局配置、集群、权限、告警规则、连接参数
├── core/ # 底层内核:远程连接、容器交互、任务引擎、加密模块
├── resource/ # 资源管理:主机、Docker、K8s、多云资源
├── cicd/ # CI/CD流水线、代码拉取、构建、发布、回滚
├── script/ # 脚本中心、批量命令、文件分发、定时任务
├── config_center/ # 配置中心、环境管理、密钥、配置下发
├── monitor/ # 监控采集、指标计算、日志检索、告警引擎
├── audit/ # 权限、审计日志、安全拦截
├── api/ # FastAPI接口、外部联动、OpenClaw对接
├── web/ # 前端管理界面、可视化看板、拖拽流水线
├── utils/ # 工具函数、日志、加密、时间、格式处理
├── requirements.txt # 项目依赖
└── main.py # 项目入口
五、完整二次开发代码
1. requirements.txt
txt
# 基础框架
fastapi>=0.104.0
uvicorn>=0.24.0
streamlit>=1.28.0
# 远程连接 & 主机管理
paramiko>=3.3.1
netmiko>=4.2.0
fabric>=2.7.0
# Docker & K8s
docker>=6.1.3
kubernetes>=28.1.0
# 数据存储 & 缓存
redis>=5.0.0
sqlalchemy>=2.0.0
# 监控 & 数据采集
psutil>=5.9.6
prometheus-client>=0.18.0
# 定时任务
apscheduler>=3.10.0
# 工具
loguru>=0.7.2
python-dotenv>=1.0.0
cryptography>=41.0.0
2. config/settings.py
python
运行
import os
from dotenv import load_dotenv
load_dotenv()
# 服务端口
API_HOST = "0.0.0.0"
API_PORT = 8130
# 数据库
DB_URL = os.getenv("DB_URL", "sqlite:///./devops.db")
# Redis 缓存
REDIS_HOST = os.getenv("REDIS_HOST", "127.0.0.1")
REDIS_PORT = int(os.getenv("REDIS_PORT", 6379))
# 远程连接默认超时
SSH_TIMEOUT = 10
# 任务执行最大并发
MAX_CONCURRENT_TASK = 20
# 告警推送Webhook
ALERT_WEBHOOK = os.getenv("ALERT_WEBHOOK", "")
# 日志保留天数
LOG_RETAIN_DAYS = 30
3. utils/logger.py
python
运行
from loguru import logger
import os
from config.settings import LOG_RETAIN_DAYS
log_path = "./logs/devops_run.log"
logger.add(
log_path,
rotation="500 MB",
retention=f"{LOG_RETAIN_DAYS} days",
level="INFO",
encoding="utf-8",
enqueue=True
)
def get_logger():
return logger
4. core/ssh_client.py(SSH 远程连接内核)
python
运行
import paramiko
from paramiko.ssh_exception import SSHException, NoValidConnectionsError
from config.settings import SSH_TIMEOUT
from utils.logger import get_logger
logger = get_logger()
class SSHClient:
def __init__(self, host, port=22, username="root", password=None, key_file=None):
self.host = host
self.port = port
self.username = username
self.password = password
self.key_file = key_file
self.client = None
def connect(self):
"""建立SSH连接"""
try:
self.client = paramiko.SSHClient()
self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
if self.key_file:
private_key = paramiko.RSAKey.from_private_key_file(self.key_file)
self.client.connect(
hostname=self.host,
port=self.port,
username=self.username,
pkey=private_key,
timeout=SSH_TIMEOUT
)
else:
self.client.connect(
hostname=self.host,
port=self.port,
username=self.username,
password=self.password,
timeout=SSH_TIMEOUT,
look_for_keys=False,
allow_agent=False
)
logger.info(f"主机 {self.host} 连接成功")
return True
except (SSHException, NoValidConnectionsError) as e:
logger.error(f"主机 {self.host} 连接失败: {str(e)}")
return False
def exec_command(self, cmd):
"""执行远程命令"""
if not self.client:
if not self.connect():
return "", "连接失败"
try:
stdin, stdout, stderr = self.client.exec_command(cmd)
out = stdout.read().decode("utf-8", errors="ignore")
err = stderr.read().decode("utf-8", errors="ignore")
return out, err
except Exception as e:
logger.error(f"执行命令异常 {self.host}: {str(e)}")
return "", str(e)
def close(self):
"""关闭连接"""
if self.client:
self.client.close()
logger.info(f"主机 {self.host} 连接已关闭")
# 批量主机执行封装
def batch_exec(host_list, cmd):
result = {}
for host_info in host_list:
cli = SSHClient(
host=host_info["host"],
port=host_info.get("port",22),
username=host_info["user"],
password=host_info.get("pwd")
)
out, err = cli.exec_command(cmd)
result[host_info["host"]] = {"stdout": out, "stderr": err}
cli.close()
return result
5. core/docker_client.py(Docker 容器管理)
python
运行
import docker
from utils.logger import get_logger
logger = get_logger()
class DockerClient:
def __init__(self, base_url="unix:///var/run/docker.sock"):
try:
self.client = docker.DockerClient(base_url=base_url)
except Exception as e:
logger.error(f"Docker 连接失败: {str(e)}")
self.client = None
def list_containers(self, all_containers=False):
"""列出容器"""
if not self.client:
return []
containers = self.client.containers.list(all=all_containers)
res = []
for c in containers:
res.append({
"id": c.short_id,
"name": c.name,
"status": c.status,
"image": c.image.tags[0] if c.image.tags else ""
})
return res
def start_container(self, container_name):
"""启动容器"""
if not self.client:
return False
try:
container = self.client.containers.get(container_name)
container.start()
logger.info(f"容器 {container_name} 启动成功")
return True
except Exception as e:
logger.error(f"启动容器失败 {container_name}: {str(e)}")
return False
def stop_container(self, container_name):
"""停止容器"""
if not self.client:
return False
try:
container = self.client.containers.get(container_name)
container.stop()
logger.info(f"容器 {container_name} 停止成功")
return True
except Exception as e:
logger.error(f"停止容器失败 {container_name}: {str(e)}")
return False
docker_cli = DockerClient()
6. monitor/host_monitor.py(主机指标监控)
python
运行
import psutil
import time
from utils.logger import get_logger
logger = get_logger()
class HostMonitor:
@staticmethod
def get_cpu_info():
"""CPU使用率"""
return psutil.cpu_percent(interval=1)
@staticmethod
def get_memory_info():
"""内存信息"""
mem = psutil.virtual_memory()
return {
"total": round(mem.total / 1024 / 1024 / 1024, 2),
"used": round(mem.used / 1024 / 1024 / 1024, 2),
"percent": mem.percent
}
@staticmethod
def get_disk_info():
"""磁盘信息"""
disk = psutil.disk_usage("/")
return {
"total": round(disk.total / 1024 / 1024 / 1024, 2),
"used": round(disk.used / 1024 / 1024 / 1024, 2),
"percent": disk.percent
}
@staticmethod
def get_all_metrics():
"""获取全量主机指标"""
return {
"cpu_percent": HostMonitor.get_cpu_info(),
"memory": HostMonitor.get_memory_info(),
"disk": HostMonitor.get_disk_info(),
"timestamp": int(time.time())
}
host_monitor = HostMonitor()
7. cicd/pipeline.py(简易 CI/CD 流水线)
python
运行
from utils.logger import get_logger
from core.ssh_client import SSHClient
logger = get_logger()
class Pipeline:
def __init__(self, name):
self.name = name
self.stages = []
def add_stage(self, stage_name, cmd_list):
"""添加流水线阶段"""
self.stages.append({
"stage_name": stage_name,
"commands": cmd_list
})
def run(self, host_info):
"""执行流水线"""
logger.info(f"开始执行流水线: {self.name}")
cli = SSHClient(
host=host_info["host"],
port=host_info.get("port",22),
username=host_info["user"],
password=host_info.get("pwd")
)
if not cli.connect():
return {"status": "fail", "msg": "主机连接失败"}
result_log = []
for stage in self.stages:
logger.info(f"执行阶段: {stage['stage_name']}")
for cmd in stage["commands"]:
out, err = cli.exec_command(cmd)
result_log.append({
"stage": stage["stage_name"],
"cmd": cmd,
"stdout": out,
"stderr": err
})
cli.close()
logger.info(f"流水线 {self.name} 执行完成")
return {"status": "success", "pipeline": self.name, "details": result_log}
8. api/route.py(FastAPI 接口 + OpenClaw 对接)
python
运行
from fastapi import FastAPI, Query, Body
from core.ssh_client import SSHClient, batch_exec
from core.docker_client import docker_cli
from monitor.host_monitor import host_monitor
from cicd.pipeline import Pipeline
from utils.logger import get_logger
app = FastAPI(title="DevOps — 自动化部署与基础设施管理")
logger = get_logger()
# 主机监控
@app.get("/monitor/host")
def get_host_metric():
"""获取本机监控指标"""
return host_monitor.get_all_metrics()
# 单主机执行命令
@app.post("/ssh/exec")
def ssh_exec(
host: str = Body(...),
user: str = Body(...),
pwd: str = Body(None),
cmd: str = Body(...)
):
cli = SSHClient(host=host, username=user, password=pwd)
out, err = cli.exec_command(cmd)
cli.close()
return {"stdout": out, "stderr": err}
# 批量主机执行
@app.post("/ssh/batch")
def ssh_batch(
host_list: list = Body(...),
cmd: str = Body(...)
):
res = batch_exec(host_list, cmd)
return res
# Docker 容器列表
@app.get("/docker/containers")
def list_container(all: bool = Query(False)):
return {"containers": docker_cli.list_containers(all)}
# 容器启停
@app.get("/docker/start")
def docker_start(name: str = Query(...)):
return {"result": docker_cli.start_container(name)}
@app.get("/docker/stop")
def docker_stop(name: str = Query(...)):
return {"result": docker_cli.stop_container(name)}
# CI/CD 流水线执行
@app.post("/cicd/run")
def run_pipeline(
pipeline_name: str = Body(...),
host_info: dict = Body(...),
stages: list = Body(...)
):
pipe = Pipeline(pipeline_name)
for s in stages:
pipe.add_stage(s["name"], s["commands"])
return pipe.run(host_info)
@app.get("/health")
def health():
return {"service": "DevOps 自动化运维平台", "status": "running"}
9. web/app.py(Streamlit 简易管理后台)
python
运行
import streamlit as st
from core.ssh_client import SSHClient
from core.docker_client import docker_cli
from monitor.host_monitor import host_monitor
st.set_page_config(page_title="DevOps 运维平台", layout="wide")
st.title("⚙️ DevOps — 自动化部署与基础设施管理")
tab1, tab2, tab3, tab4 = st.tabs(["主机监控","远程命令","容器管理","任务流水线"])
# 主机监控
with tab1:
st.subheader("本机资源监控")
metric = host_monitor.get_all_metrics()
st.metric("CPU使用率", f"{metric['cpu_percent']} %")
st.metric("内存使用率", f"{metric['memory']['percent']} %")
st.metric("磁盘使用率", f"{metric['disk']['percent']} %")
# 远程命令
with tab2:
st.subheader("远程主机执行命令")
host = st.text_input("主机IP")
user = st.text_input("用户名", value="root")
pwd = st.text_input("密码", type="password")
cmd = st.text_area("执行命令")
if st.button("执行"):
cli = SSHClient(host=host, username=user, password=pwd)
out, err = cli.exec_command(cmd)
st.code(out, language="shell")
if err:
st.error(err)
cli.close()
# 容器管理
with tab3:
st.subheader("Docker 容器列表")
if st.button("刷新容器"):
containers = docker_cli.list_containers(all=True)
st.dataframe(containers)
# 流水线
with tab4:
st.subheader("CI/CD 简易流水线")
st.info("可配置编译、打包、部署多阶段命令并执行")
10. main.py(项目入口)
python
运行
import uvicorn
from api.route import app
from config.settings import API_HOST, API_PORT
from utils.logger import get_logger
logger = get_logger()
if __name__ == "__main__":
logger.info("DevOps 自动化部署与基础设施管理平台 启动成功")
uvicorn.run(app, host=API_HOST, port=API_PORT)
六、特色改造落地说明
- 多架构统一纳管 整合传统主机、Docker、K8s、多云资源,一套平台完成全基础设施管控,减少运维工具数量。
- 批量运维 + 脚本复用 封装批量 SSH 执行、文件分发、脚本库,支持定时周期任务,大幅降低重复人工操作。
- 轻量化 CI/CD 流水线 内置简易流水线引擎,支持多阶段任务、串行执行、上线追溯与回滚,满足中小型团队发布需求。
- 全维度监控体系 采集主机核心指标、容器状态,搭配告警能力,实现故障早发现、早处理。
- OpenClaw 生态联动 对外提供标准 API,可被其他工具调用执行部署、巡检、启停任务;运维报表、告警信息可推送至视频生成、公众号监控等模块。
- 安全审计能力 完整操作日志、命令审计、连接加密,满足企业基础合规要求。
七、使用示例
1. 启动服务
bash
运行
python main.py
# Web 界面:http://127.0.0.1:8501
# API 接口:http://127.0.0.1:8130
2. 常用 API 调用
plaintext
# 获取本机监控指标
http://127.0.0.1:8130/monitor/host
# 查看Docker容器
http://127.0.0.1:8130/docker/containers
# 启动容器
http://127.0.0.1:8130/docker/start?name=nginx
3. Web 后台操作
- 查看本机 CPU、内存、磁盘实时状态
- 输入主机信息与命令,远程执行并查看结果
- 查看、启停本地 Docker 容器
- 配置并执行简易发布流水线
八、二次开发拓展方向
- 接入 Kubernetes 完整集群管理,实现节点、Pod、资源配额、存储卷深度管控
- 完善可视化拖拽 CI/CD 流水线,增加分支选择、制品上传、人工审核节点
- 集成 Prometheus + Grafana 实现专业大屏监控、时序数据存储与图表展示
- 开发文件批量分发、目录同步、配置模板功能
- 增加堡垒机能力,会话录制、回放、高危命令拦截
- 对接云厂商 SDK,实现多云资源创建、销毁、弹性伸缩全自动化
- 增加版本管理、灰度发布、蓝绿发布等高阶发布策略