怎么用脚本生成系统信息报告

wen 实用脚本 2

**
《运维效率倍增:用脚本自动生成系统信息报告,省下80%重复劳动》

怎么用脚本生成系统信息报告


目录导读

  1. 为什么你需要一份“自动化系统报告”?
  2. 报告脚本的通用设计逻辑(模块化拆解)
  3. 三分钟上手:Python + Bash 双版本核心代码实战
    • 1 硬件信息采集(CPU/内存/磁盘)
    • 2 网络与进程状态捕获
    • 3 生成时间戳与崩溃日志摘要
  4. 进阶:将报告推送至钉钉/邮件/Webhook
  5. 高频答疑(QA):脚本安全性、跨平台兼容、定时任务陷阱
  6. 自动化脚本不是“银弹”,而是运维的“杠杆”

为什么你需要一份“自动化系统报告”?

作为运维工程师或系统管理员,你是否每周甚至每天都要执行这些操作:登录服务器、敲击 df -h、查看 top、抓取 ss -tulpn、翻找 /var/log/messages……然后手动整理成一份 Word 或 Markdown 报告发给主管,这个过程不仅枯燥,而且极易出错——漏看一个磁盘分区、遗漏一个异常服务,都可能导致生产事故。

用脚本生成系统信息报告的核心价值在于:确定性 + 时效性,脚本把“采集、分析、汇总、输出”这四个动作标准化,无论服务器有100台还是1000台,只需一条命令或一个定时任务,五秒钟内就能生成一份结构化的JSON或HTML报告,这并非炫技,而是将人力从“数据搬运工”角色中解放出来,投入到故障预判和性能调优中。

报告脚本的通用设计逻辑(模块化拆解)

一份优秀的报告脚本,绝不是一堆命令的堆砌,它应当遵循“采集-解析-渲染”三层架构:

  • 采集层:调用系统原生命令或PSUtil类库,获取底层数据,注意使用 subprocessos.popen 时,务必捕获超时异常,避免僵尸进程。
  • 解析层:将采集到的字符串转换为结构化字典。df -P 输出后,用正则剥离表头,计算出 使用率百分比,而不是直接丢出KB数值。
  • 渲染层:根据目标用户(是给CTO看,还是给开发排查问题?)决定输出格式,人类可读用表格Markdown;机器对接用JSON;长期归档用CSV。

建议所有脚本先定义一个 collect_all_metrics() 函数,内部按类别调用子函数,并在主函数末尾统一 print(json.dumps(report, indent=2)),这样脚本既是工具,也是API接口。

三分钟上手:Python + Bash 双版本核心代码实战

我们以一个通用场景为例:统计服务器关键指标,并生成带时间戳的文本报告,注意:以下代码已过滤无用信息,直接复制即可运行。

1 硬件信息采集(CPU/内存/磁盘)

#!/bin/bash
# bash 版本:快速生成硬件快照
REPORT="/tmp/sys_report_$(date +%Y%m%d).txt"
echo "=== CPU 核心数 ===" >> $REPORT
nproc >> $REPORT
echo "=== 内存占用 TOP5 ===" >> $REPORT
ps aux --sort=-%mem | head -5 >> $REPORT
echo "=== 磁盘根分区使用率 ===" >> $REPORT
df -h / | tail -1 >> $REPORT

Python版本则更优雅:

import psutil, platform, json, socket
def collect_hw():
    mem = psutil.virtual_memory()
    disk = psutil.disk_usage('/')
    return {
        "cpu_cores": psutil.cpu_count(logical=True),
        "cpu_load": psutil.getloadavg(),
        "mem_total_gb": round(mem.total / (1024**3), 2),
        "mem_percent": mem.percent,
        "disk_percent": disk.percent
    }

2 网络与进程状态捕获
判断网络是否通畅,不能只靠 ping,脚本里建议并发检测关键端口

import socket
def check_port(ip, port, timeout=2):
    s = socket.socket()
    s.settimeout(timeout)
    try:
        s.connect((ip, port))
        return True
    except:
        return False
    finally:
        s.close()

3 生成时间戳与崩溃日志摘要
定位最近1小时内核报错:

journalctl --since "1 hour ago" -p err --no-pager | tail -20 >> $REPORT

进阶:将报告推送至钉钉/邮件/Webhook

采集是内功,推送是外功,利用 requests 库,将JSON数据POST到企业微信机器人:

import requests, json
webhook_url = "https://your_company.com/robot/send"
payload = {"msgtype": "text", "text": {"content": json.dumps(collect_hw(), ensure_ascii=False)}}
requests.post(webhook_url, json=payload, timeout=5)

高频答疑(QA):脚本安全性、跨平台兼容、定时任务陷阱

问:脚本包含pswd或密钥,如何防止泄露?
答:禁止在脚本中硬编码任何鉴权信息,应使用环境变量注入(export DB_PASSWD='xxx'),或挂载至 /etc/sys_report/.env 文件,且该文件权限必须设为600。

问:脚本在CentOS与Ubuntu上输出不一致怎么办?
答:优先使用Python的platform模块和psutil库,它们内部已屏蔽系统差异,若必须调系统命令,先用 distro.id() 判断发行版,再执行不同分支代码。

问:crontab里执行脚本,为何生成的文件是空的?
答:这是环境变量缺失问题,多数cron服务不加载用户.bashrc,脚本首行需写死#!/usr/bin/python3,且在crontab中指定PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin


脚本生成系统信息报告,本质是一次“知识固化”,你不必追求一门庞大的监控平台,只需要几个精心设计的函数,就能获得精准、透明、可审计的数据。当报告中出现异常时,你能更快定位;当重复劳动消失后,你有时间思考架构优化。 这,才是自动化脚本最深层的价值,打开终端,写下你的第一行 def collect_cpu(),让服务器开始为你打工吧。

抱歉,评论功能暂时关闭!