项目说明

概述

  • 本项目以 RHCE核心知识点为基础,结合硅基流动开源大模型 API,构建一套自动化 Linux 运维文档生成系统

  • 系统可定时采集 Linux 服务器的核心运维数据(系统配置、资源状态、服务运行情况、故障日志等),通过硅基流动大模型自动生成结构化、符合 RHCE 规范的 Markdown 格式运维日报,同时支持文档自动备份,全程无需人工干预。

  • 核心价值:替代人工编写运维文档,提升运维效率;融合 Linux 系统管理与 AI 文本生成技术,贴合企业 “运维 + AI” 的技术落地需求。

项目组织方式及时间

方式 内容
组织方式 单人 / 小组开发(1-3 人),按 “环境准备→脚本开发→功能测试→定时部署→优化加固” 分阶段实施
时间规划 总计 3 个工作日(8 小时 / 天) ・第 1 天:环境搭建、硅基流动 API 申请、核心知识点梳理 ・第 2 天:数据采集脚本、AI 文档生成脚本开发与调试 ・第 3 天:定时任务配置、权限加固、系统测试与优化

项目背景知识

系统需求

  • 功能需求

    ① 自动采集 Linux 服务器基础信息、硬件资源、服务状态、故障日志等运维数据;

    ② 调用硅基流动 API,将采集数据转化为结构化 Markdown 运维日报;

    ③ 配置定时任务,每日自动执行数据采集、文档生成、远程备份;

    ④ 保障系统安全,实现密钥隔离、文件权限管控、SELinux 策略加固。

  • 非功能需求

    ① 兼容性:适配 RHEL9 系统,兼容硅基流动主流开源模型(Qwen-2、DeepSeek-R1);

    ② 稳定性:定时任务执行成功率≥99%,JSON 数据解析容错率 100%;

    ③ 安全性:API 密钥非硬编码,运维数据仅本地存储,无敏感信息外泄。

RHCE 核心知识点

  • 本项目核心复用 RHCE 以下关键技能,是系统落地的基础:

知识点 应用场景
Shell 脚本编程 编写运维数据采集脚本,实现命令输出格式化、特殊字符处理
Cron 定时任务 配置每日自动执行的任务调度,实现无人值守运行
文件权限 / SELinux 管理 管控运维数据、文档、脚本的访问权限,加固系统安全
Rsync 远程备份 将生成的运维文档备份至远程服务器,防止数据丢失
防火墙配置 开放硅基流动 API 的网络访问权限,限制非法请求

硅基流动大模型 API

  • 硅基流动(SiliconFlow)是开源大模型一站式部署 / 调用平台,支持 Qwen-2、DeepSeek、Llama 3 等主流开源模型,其 API 兼容 OpenAI 接口格式,无需复杂开发即可快速集成。

  • 核心优势:

    • 7B/9B 量级模型永久免费,满足中小企业 / 个人使用需求;

    • 中文优化效果好,对 Linux 运维术语(如 SELinux、firewalld)适配性强;

    • API 调用流程简单,兼容 OpenAI SDK,开发成本低。

技术架构

image-20260126104317049

  • 架构说明

    • 底层依托 Linux 服务器(RHEL 9),通过 Shell 脚本采集多维度运维数据并生成合法 JSON 文件;

    • Python 脚本读取 JSON 数据,按运维文档规范生成提示词,调用硅基流动 API;

    • 硅基流动大模型返回结构化 Markdown 文档,系统自动将文档备份至远程服务器;

    • Cron 定时任务驱动全流程每日自动执行,实现无人值守。

    • 将产生的报告上传到备份机中备份

image-20260126150501158

软硬件环境清单

报告采集设备

类别 名称 / 规格 版本 / 参数 用途 备注
硬件环境 虚拟机 CPU:≥2 核,内存:≥4GB,磁盘:≥20GB 运行 Linux 系统、执行脚本、存储文档 可使用本地虚拟机或云服务器(如阿里云 ECS)
软件环境 操作系统 RHEL 9.3 项目核心运行环境,贴合 RHCE 认证标准 需配置基础网络,能访问外网(硅基流动 API)
Python 3.9+ 编写 AI 文档生成脚本,调用硅基流动 API 需安装 requests、python-dotenv、openai 库
Shell Bash 5.1+ 编写运维数据采集脚本 系统默认自带,无需额外安装
依赖工具 jq 验证 JSON 文件格式合法性 通过 yum install jq 安装
rsync 远程备份运维文档 系统默认自带,需配置 SSH 免密登录
crontab 配置定时任务 系统默认自带,需启用 crond 服务
网络环境 外网访问 IP:192.168.88.131 主机名: server 调用硅基流动 API 内网服务器需配置代理 / 防火墙白名单
账号资源 硅基流动账号 完成实名认证 获取 API Key,调用大模型 官网:https://siliconflow.cn

备份机

类别 名称 / 规格 版本 / 参数 用途 备注
硬件环境 虚拟机 CPU:≥2 核,内存:≥4GB,磁盘:≥20GB 运行 Linux 系统、执行脚本、存储文档 可使用本地虚拟机或云服务器(如阿里云 ECS)
软件环境 操作系统 RHEL 9.3 项目核心运行环境,贴合 RHCE 认证标准 需配置基础网络,能访问外网(硅基流动 API)
网络环境 内网访问 IP:192.168.88.132 主机名:backup

任务清单

项目环境搭建

  • 新建RHCE9.3 虚拟机

  • 按照规划,最小化部署系统,禁用SELinux,确保能够联网,YUM仓库可用。

  • 注册硅基流动账号并获取 API Key,可正常调用测试接口

  • 安装 Python 依赖库、jq 等工具,执行 pip3 list 能看到 openai、requests 库

脚本开发

  • 编写 Shell 数据采集脚本,生成合法 JSON 文件,包含所有运维数据维度

  • 编写 Python AI 文档生成脚本,能调用硅基流动 API,生成 Markdown 文档

  • 编写自动化调度脚本,整合采集、生成、备份逻辑,脚本可独立运行

功能测试

  • 测试数据采集脚本,JSON 文件格式合法,无特殊字符、空值问题

  • 测试 AI 文档生成功能,生成的文档格式规范,包含指定 5 个模块

  • 测试定时任务与备份,Crontab 任务按时执行,文档成功备份至远程服务器

项目实施

环境搭建

  • 安装2台虚拟机及RHEL9.3系统 ,过程略

  • 关闭selinx:

[root@localhost ~]# sed -i '7s/enforcing/disabled/'  /etc/selinux/config
​
[root@localhost ~]# systemctl  status  firewalld    
  • 修改主机名

# 报告采集机(192.168.88.131):
[root@localhost ~]# hostnamectl  set-hostname  server
[root@localhost ~]# bash
​
# 备份机(192.168.88.132):
[root@localhost ~]# hostnamectl  set-hostname  backup
[root@localhost ~]# bash
  • 报告采集机: 下载所需软件

[root@server ~]# yum  install  vim  tar  tree  net-tools  openssh  -y
​
[root@server ~]# yum  install  python3 python3-pip jq rsync  -y
​
[root@server ~]# pip install requests python-dotenv openai
  • 项目目录创建

# 报告采集机(192.168.88.131)
​
[root@server ~]# mkdir  -p  /opt/ai_ops_doc/{scripts,data,docs,backup}
​
[root@server ~]# tree  /opt/ai_ops_doc
/opt/ai_ops_doc
├── backup
├── data
├── docs
└── scripts
​
4 directories, 0 files
​
# 创建运维组并配置权限
[root@server ~]# groupadd ops
[root@server ~]# chown -R root:ops /opt/ai_ops_doc
[root@server ~]# chmod -R 750 /opt/ai_ops_doc
[root@server ~]# ll   /opt/ai_ops_doc
总用量 0
drwxr-x--- 2 root ops 6  1月 26 09:50 backup
drwxr-x--- 2 root ops 6  1月 26 14:01 data
drwxr-x--- 2 root ops 6  1月 26 14:01 docs
drwxr-x--- 2 root ops 6  1月 26 14:02 scripts
# 报告备份机(192.168.88.132)
​
[root@backup ~]# mkdir   /backup   # 新建用于存储备份数据的目录
  • 报告采集机需要免密登录到备份机

# 定为报告采集机(192.168.88.131)
​
[root@server ~]# ssh-keygen  -t rsa
# 一路回车
​
[root@server ~]# ssh-copy-id  192.168.88.132
# 第一次需要输入yes和132机子的root账户登录密码

获取硅基流动 API Key

网址:

image-20260126140549903

  • 登录后进入 “API 密钥”→“新建 API 密钥”,填写密钥名称并保存

image-20260126140643908

配置环境变量存储密钥(避免硬编码)
[root@server ~]# echo "SILICONFLOW_API_KEY=你的硅基流动API密钥" > ~/.env
[root@server ~]# chmod 600 ~/.env  # 仅当前用户可读
​
[root@server ~]# cat  .env
OPENAI_API_KEY=sk-tcycgun.......xowmzacaaxpppzqkyiuppu

脚本开发阶段

编写 Shell 数据采集脚本
  • 创建/opt/ai_ops_doc/scripts/collect_data.sh,实现运维数据采集与 JSON 格式化:

[root@server ~]# vim  /opt/ai_ops_doc/scripts/collect_data.sh
​
​
#!/bin/bash
set -e  # 遇到错误立即退出
DATA_DIR="/opt/ai_ops_doc/data"
DATA_FILE="${DATA_DIR}/ops_data_$(date +%Y%m%d).json"
​
# 确保数据目录存在
mkdir -p ${DATA_DIR}
​
# 安全采集函数:处理特殊字符与空值
safe_collect() {
    local cmd="$1"
    output=$(eval $cmd 2>/dev/null || echo "")
    # 处理转义换行、制表符、双引号等特殊字符
    echo "$output" | sed -e 's/\n/ /g' -e 's/\t/ /g' -e 's/"/\\"/g' -e 's/  */ /g' | xargs
}
​
# 生成合法JSON文件
cat > ${DATA_FILE} << EOF
{
    "采集时间": "$(date +'%Y-%m-%d %H:%M:%S')",
    "系统版本": "$(safe_collect 'cat /etc/redhat-release')",
    "内核版本": "$(safe_collect 'uname -r')",
    "主机名": "$(safe_collect 'hostname')",
    "磁盘使用情况": "$(safe_collect 'df -h | grep -v tmpfs | grep -v loop')",
    "内存使用情况": "$(safe_collect 'free -h')",
    "CPU负载": "$(safe_collect 'uptime | awk "{print \$8,\$9,\$10}"')",
    "关键服务状态": "$(safe_collect 'systemctl list-units --type=service --state=running | grep -E "sshd|httpd|nginx|firewalld|crond"')",
    "防火墙规则": "$(safe_collect 'firewall-cmd --list-all --zone=public')",
    "近24小时故障日志": "$(safe_collect 'journalctl --since "24 hours ago" --priority=err | head -20')"
}
EOF
​
# 权限配置
chmod 640 ${DATA_FILE}
chown root:ops ${DATA_FILE}
​
# 验证JSON格式
if jq . ${DATA_FILE} &>/dev/null; then
    echo "JSON数据采集成功:${DATA_FILE}"
else
    echo "JSON格式错误,文件内容:"
    cat ${DATA_FILE}
    exit 1
fi
  • 执行

[root@server ~]# chmod 750 /opt/ai_ops_doc/scripts/collect_data.sh
​
[root@server ~]# bash  /opt/ai_ops_doc/scripts/collect_data.sh
JSON数据采集成功:/opt/ai_ops_doc/data/ops_data_20260126.json
​
[root@server ~]# cat  /opt/ai_ops_doc/data/ops_data_20260126.json
{
    "采集时间": "2026-01-26 14:12:39",
    "系统版本": "Red Hat Enterprise Linux release 9.3 (Plow)",
    "内核版本": "5.14.0-362.8.1.el9_3.x86_64",
    "主机名": "server",
    "磁盘使用情况": "文件系统 容量 已用 可用 已用% 挂载点 /dev/mapper/rhel-root 15G 6.1G 8.6G 42% / /dev/sda2 960M 260M 701M 27% /boot /dev/sda1 300M 7.0M 293M 3% /boot/efi /dev/sr0 9.9G 9.9G 0 100% /run/media/root/RHEL-9-3-0-BaseOS-x86_64",
    "内存使用情况": "total used free shared buff/cache available Mem: 1.9Gi 1.1Gi 76Mi 15Mi 841Mi 752Mi Swap: 4.0Gi 677Mi 3.3Gi",
    "CPU负载": "average: 0.00, 0.03,",
    "关键服务状态": "crond.service loaded active running Command Scheduler firewalld.service loaded active running firewalld - dynamic firewall daemon sshd.service loaded active running OpenSSH server daemon",
    "防火墙规则": "public (active) target: default icmp-block-inversion: no interfaces: ens160 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:",
    "近24小时故障日志": ......
}
​
编写 Python AI 文档生成脚本
  • 在硅基流动网站选择合适的模型

image-20260126141621842

image-20260126141703535

  • 创建/opt/ai_ops_doc/scripts/generate_doc.py,调用硅基流动 API 生成运维文档:

[root@server ~]# vim   /opt/ai_ops_doc/scripts/generate_doc.py
​
import os
import json
import grp
from dotenv import load_dotenv
from datetime import datetime
from openai import OpenAI
​
# 加载硅基流动配置
load_dotenv("/root/.env")
SILICONFLOW_API_KEY = os.getenv("SILICONFLOW_API_KEY")
SILICONFLOW_BASE_URL = "https://api.siliconflow.cn/v1"
MODEL_NAME = "deepseek-ai/DeepSeek-R1"
​
def load_ops_data():
    """加载运维数据"""
    data_date = datetime.now().strftime("%Y%m%d")
    data_file = f"/opt/ai_ops_doc/data/ops_data_{data_date}.json"
    
    if not os.path.exists(data_file):
        return {"error": f"数据文件不存在:{data_file}"}
    if os.path.getsize(data_file) == 0:
        return {"error": "数据文件为空,请重新执行采集脚本"}
    
    try:
        with open(data_file, "r", encoding="utf-8") as f:
            return json.load(f)
    except json.JSONDecodeError as e:
        return {"error": f"JSON解析失败:{str(e)}"}
    except Exception as e:
        return {"error": f"读取文件失败:{str(e)}"}
​
def generate_prompt(ops_data):
    """生RHCE运维日报提示词"""
    if "error" in ops_data:
        prompt = f"""请以资深RHCE工程师身份,根据以下错误信息生成故障排查文档(Markdown格式)。要求内容专业严谨、语言简洁规范,除必要Linux命令外均用中文,包含“错误描述”“原因分析”“具体解决过程”“验证方法”四部分,解决过程步骤清晰、符合RHCE运维逻辑,可直接落地执行。
​
错误内容:{ops_data['error']}"""
    else:
        prompt = f"""请以资深RHCE工程师身份,基于以下Linux服务器采集数据,生成一份结构化运维日报,格式为Markdown。要求内容专业严谨、语言简洁规范,除必要的Linux命令外,其余表述全部使用中文,问题分析需附带具体解决过程,完全贴合企业RHCE运维标准。
​
## 核心要求
### 1. 文档结构
严格包含五大模块,顺序不可调整:
- 标题:格式为“Linux服务器运维日报 - 采集日期”(采集日期取自数据中的“采集时间”字段);
- 采集信息:汇总服务器基础信息(主机名、系统版本、内核版本)及采集时间,清晰罗列;
- 系统状态总结:整体评估服务器运行状态(正常/存在风险/异常),概括核心资源(磁盘、内存、CPU)占用情况及关键服务运行状态;
- 问题分析:从故障日志及资源状态中提取所有关键问题,每个问题需包含“问题描述”“风险等级”(低/中/高)“具体解决过程”三部分,解决过程需步骤清晰、可落地,符合RHCE运维逻辑;
- 优化建议:基于RHCE规范,针对服务器当前状态给出可执行建议,覆盖磁盘清理、服务调优、防火墙规则优化、安全加固等维度,建议需对应实际场景,不空洞。
​
### 2. 问题分析细则
- 风险等级判定标准:高风险(影响业务运行、服务器稳定性,需立即处理)、中风险(不影响核心业务,但存在潜在隐患,需24小时内处理)、低风险(仅为优化项,不影响服务器运行,可定期处理);
- 解决过程需包含“问题定位步骤→操作命令→验证方法”,命令需标注用途,操作逻辑符合RHCE故障排查流程(如先排查日志、再定位原因、最后执行修复并验证)。
​
### 3. 内容规范
语言简洁无冗余,避免口语化表述,专业术语使用准确(如“防火墙”统一指firewalld,“SELinux”不简写),Markdown格式排版整齐(标题层级分明、列表有序,关键信息可加粗)。
​
## 服务器采集数据
{json.dumps(ops_data, ensure_ascii=False, indent=2)}"""
    return prompt
​
def call_siliconflow_api(prompt):
    """调用硅基流动API"""
    try:
        client = OpenAI(
            api_key=SILICONFLOW_API_KEY,
            base_url=SILICONFLOW_BASE_URL
        )
        response = client.chat.completions.create(
            model=MODEL_NAME,
            messages=[{"role": "user", "content": prompt}],
            temperature=0.3,
            max_tokens=2000
        )
        return response.choices[0].message.content
    except Exception as e:
        return f"API调用失败:{str(e)}"
​
def save_doc(content):
    """保存Markdown文档(修复组GID获取逻辑)"""
    doc_date = datetime.now().strftime("%Y%m%d")
    doc_file = f"/opt/ai_ops_doc/docs/ops_report_{doc_date}.md"
    
    # 写入文档内容
    with open(doc_file, "w", encoding="utf-8") as f:
        f.write(content)
    
    # 设置文件权限(只读给组,仅root可写)
    os.chmod(doc_file, 0o640)
    
    # 修复:获取ops组GID(增加容错)
    try:
        # 使用grp模块获取组信息(标准方法)
        ops_gid = grp.getgrnam("ops").gr_gid
    except KeyError:
        # 若ops组不存在,默认使用root组(GID=0)
        ops_gid = 0
        print(f"警告:未找到ops组,文档文件将归属root组(GID=0)")
    
    # 设置文件属主和属组(root:ops 或 root:root)
    os.chown(doc_file, 0, ops_gid)
    
    return doc_file
​
if __name__ == "__main__":
    ops_data = load_ops_data()
    prompt = generate_prompt(ops_data)
    doc_content = call_siliconflow_api(prompt)
    doc_path = save_doc(doc_content)
    print(f"文档生成成功:{doc_path}")
    print(f"文档预览:{doc_content[:100]}...")
​
  • 执行

[root@server ~]# python3 /opt/ai_ops_doc/scripts/generate_doc.py
文档生成成功:/opt/ai_ops_doc/docs/ops_report_20260126.md
文档预览:```markdown
# Linux服务器运维日报 - 2026-01-26
​
## 采集信息
- **采集时间**: 2026-01-26 14:12:39
- **系统版本**: Red Hat...
# 查看AI反馈的日报结果和运维建议
​
[root@server docs]# cat  /opt/ai_ops_doc/docs/ops_report_20260126.md
```markdown
# Linux服务器运维日报 - 2026-01-26
​
## 采集信息
- **采集时间**: 2026-01-26 14:12:39
- **系统版本**: Red Hat Enterprise Linux release 9.3 (Plow)
- **内核版本**: 5.14.0-362.8.1.el9_3.x86_64
- **主机名**: server
- **磁盘使用情况**:
……………………
编写自动化调度脚本
  • 创建/opt/ai_ops_doc/scripts/auto_run.sh,整合采集、生成、备份逻辑:

[root@server ~]# vim  /opt/ai_ops_doc/scripts/auto_run.sh
​
#!/bin/bash
# 日志文件
LOG_FILE="/var/log/ai_ops_doc.log"
​
# 远程备份配置(替换为实际服务器信息)
REMOTE_IP="192.168.88.132"
REMOTE_DIR="/backup/ops_docs"
​
# 日志函数
log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> ${LOG_FILE}
}
​
log "开始执行自动化任务"
​
# 1. 数据采集
if /opt/ai_ops_doc/scripts/collect_data.sh; then
    log "数据采集成功"
else
    log "数据采集失败"
    exit 1
fi
​
# 2. 文档生成
if python3 /opt/ai_ops_doc/scripts/generate_doc.py; then
    log "文档生成成功"
else
    log "文档生成失败"
    exit 1
fi
​
# 3. 远程备份
DOC_FILE="/opt/ai_ops_doc/docs/ops_report_$(date +%Y%m%d).md"
if [ -f ${DOC_FILE} ]; then
    rsync -avz ${DOC_FILE} root@${REMOTE_IP}:${REMOTE_DIR} >> ${LOG_FILE} 2>&1
    if [ $? -eq 0 ]; then
        log "文档备份成功"
    else
        log "文档备份失败"
    fi
else
    log "备份失败:文档文件不存在"
fi
​
log "自动化任务执行完成"
​
​
​
[root@server ~]# chmod +x  /opt/ai_ops_doc/scripts/auto_run.sh
  • 执行

[root@server ~]# bash /opt/ai_ops_doc/scripts/auto_run.sh
JSON数据采集成功:/opt/ai_ops_doc/data/ops_data_20260126.json
文档生成成功:/opt/ai_ops_doc/docs/ops_report_20260126.md
文档预览:```markdown
# Linux服务器运维日报 - 2026-01-26
​
## 采集信息
- **采集时间**: 2026-01-26 15:16:40
- **系统版本**: Red Hat...
​
# 查看日志
[root@server ~]# cat  /var/log/ai_ops_doc.log
[2026-01-26 15:19:46] 开始执行自动化任务
[2026-01-26 15:19:46] 数据采集成功
[2026-01-26 15:20:07] 文档生成成功
sending incremental file list
ops_report_20260126.md
​
sent 2,293 bytes  received 59 bytes  1,568.00 bytes/sec
total size is 4,199  speedup is 1.79
[2026-01-26 15:20:08] 文档备份成功
[2026-01-26 15:20:08] 自动化任务执行完成
​
# 查看备份机的备份内容
[root@backup ~]# ls  /backup
ops_docs
​
配置定时任务
  • 配置 定时任务,每日凌晨 2 点执行:

[root@server ~]# crontab -e
# 添加以下内容
0 2 * * * /opt/ai_ops_doc/scripts/auto_run.sh >> /var/log/ai_ops_doc.log 2>&1
​
[root@server ~]# crontab -l
0 2 * * * /opt/ai_ops_doc/scripts/auto_run.sh >> /var/log/ai_ops_doc.log 2>&1
​
[root@server ~]# tail -f  /var/log/ai_ops_doc.log
项目测试
[root@server ~]# tree /opt/
/opt/
└── ai_ops_doc
    ├── backup
    ├── data
    │   └── ops_data_20260126.json
    ├── docs
    │   └── ops_report_20260126.md
    └── scripts
        ├── auto_run.sh
        ├── collect_data.sh
        └── generate_doc.py
​
5 directories, 5 files
Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐