一、独立标题 & 差异化定位

DevOps — 一站式自动化运维与基础设施管理平台 | 容器编排・CI/CD 流水线・主机监控・配置管理・多云协同・全链路自动化运维工作台

核心定位

主机管理、容器服务、CI/CD 流水线、配置中心、日志审计、监控告警、多云资源编排于一体的全栈 DevOps 平台,面向研发、运维、测试团队,打通「代码提交→构建→测试→镜像打包→部署→监控→运维」全流程。深度适配前文 OpenClaw 工具生态,支持脚本联动、任务编排、批量调度,兼顾传统虚拟机、Docker、K8s、公有云 / 私有云混合架构,实现运维自动化、流程标准化、故障可视化、资源集约化

独家改造特色(区别普通运维工具)

  1. 全架构统一纳管 同时支持物理机、虚拟机、Docker、Kubernetes、主流公有云资源统一管理,无需切换多套平台,单控制台完成全基础设施管控。
  2. 可视化 CI/CD 流水线 拖拽式流水线编排,支持多阶段、多分支、并行 / 串行任务、人工卡点、版本回滚;兼容 Git、SVN,一键完成编译、打包、镜像制作、环境部署。
  3. 批量运维 + 脚本引擎 内置远程执行引擎,支持批量主机命令、批量文件分发、定时任务、自定义脚本库,脚本可复用、版本归档、权限隔离,对接 OpenClaw 任务调度体系。
  4. 一体化监控告警 主机指标、容器指标、服务端口、日志、进程、接口状态全维度监控,多阈值告警、告警收敛、分级推送,故障自动定位、趋势分析。
  5. 配置中心 + 环境隔离 统一管理应用配置、环境变量、密钥、启动参数,开发 / 测试 / 预发 / 生产环境一键切换,配置热更新、版本追溯、灰度下发。
  6. 生态深度联动 可调用 Remotion 生成运维报表视频、Wechat Article Search/WeChat MP CN 推送运维告警、Financial Calculator Pro 计算资源成本、Backtest Expert 联动服务启停任务。
  7. 安全审计 + 权限体系 细粒度 RBAC 权限、操作日志全留存、命令审计、高危命令拦截、IP 白名单,满足企业合规要求。
  8. 离线私有化部署 完整离线运行,不依赖外网,支持单机 / 集群部署,轻量化设计,低配服务器也可稳定运行。

二、传统运维工具痛点

  • ❌ 工具割裂: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)

六、特色改造落地说明

  1. 多架构统一纳管 整合传统主机、Docker、K8s、多云资源,一套平台完成全基础设施管控,减少运维工具数量。
  2. 批量运维 + 脚本复用 封装批量 SSH 执行、文件分发、脚本库,支持定时周期任务,大幅降低重复人工操作。
  3. 轻量化 CI/CD 流水线 内置简易流水线引擎,支持多阶段任务、串行执行、上线追溯与回滚,满足中小型团队发布需求。
  4. 全维度监控体系 采集主机核心指标、容器状态,搭配告警能力,实现故障早发现、早处理。
  5. OpenClaw 生态联动 对外提供标准 API,可被其他工具调用执行部署、巡检、启停任务;运维报表、告警信息可推送至视频生成、公众号监控等模块。
  6. 安全审计能力 完整操作日志、命令审计、连接加密,满足企业基础合规要求。

七、使用示例

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 容器
  • 配置并执行简易发布流水线

八、二次开发拓展方向

  1. 接入 Kubernetes 完整集群管理,实现节点、Pod、资源配额、存储卷深度管控
  2. 完善可视化拖拽 CI/CD 流水线,增加分支选择、制品上传、人工审核节点
  3. 集成 Prometheus + Grafana 实现专业大屏监控、时序数据存储与图表展示
  4. 开发文件批量分发、目录同步、配置模板功能
  5. 增加堡垒机能力,会话录制、回放、高危命令拦截
  6. 对接云厂商 SDK,实现多云资源创建、销毁、弹性伸缩全自动化
  7. 增加版本管理、灰度发布、蓝绿发布等高阶发布策略