diff --git a/MD/Python 自动化运维案例.md b/MD/Python 自动化运维案例.md new file mode 100644 index 0000000..434ee89 --- /dev/null +++ b/MD/Python 自动化运维案例.md @@ -0,0 +1,409 @@ +

Python 自动化运维案例

+ +**作者:行癫(盗版必究)** + +------ + +## 一:获取监控系统信息 + +#### 1.运行环境 + +​ python 3 + +​ pip 3 + +#### 2.脚本文件 + +```python +#!/usr/bin/env python3 +import psutil +import socket +import datetime + +def get_cpu_info(): + return { + "cpu_percent": psutil.cpu_percent(interval=1), + "cpu_cores": psutil.cpu_count(logical=False), + "cpu_threads": psutil.cpu_count(logical=True) + } + +def get_memory_info(): + mem = psutil.virtual_memory() + return { + "total": mem.total, + "available": mem.available, + "used": mem.used, + "percent": mem.percent + } + +def get_disk_info(): + partitions = psutil.disk_partitions() + disk_info = {} + for p in partitions: + usage = psutil.disk_usage(p.mountpoint) + disk_info[p.mountpoint] = { + "total": usage.total, + "used": usage.used, + "free": usage.free, + "percent": usage.percent + } + return disk_info + +def get_network_info(): + net_io = psutil.net_io_counters() + return { + "bytes_sent": net_io.bytes_sent, + "bytes_recv": net_io.bytes_recv + } + +def get_uptime(): + boot_time = datetime.datetime.fromtimestamp(psutil.boot_time()) + now = datetime.datetime.now() + return str(now - boot_time).split('.')[0] + +def get_hostname(): + return socket.gethostname() + +def main(): + print(f"主机名: {get_hostname()}") + print(f"系统运行时间: {get_uptime()}") + print("\n=== CPU 信息 ===") + for k, v in get_cpu_info().items(): + print(f"{k}: {v}") + + print("\n=== 内存 信息 ===") + for k, v in get_memory_info().items(): + print(f"{k}: {v // (1024 * 1024)} MB") + + print("\n=== 磁盘 信息 ===") + disk_info = get_disk_info() + for mount, info in disk_info.items(): + print(f"\n挂载点: {mount}") + for k, v in info.items(): + if isinstance(v, (int, float)): + print(f" {k}: {v // (1024 * 1024)} MB" if 'percent' not in k else f" {k}: {v}%") + else: + print(f" {k}: {v}") + + print("\n=== 网络 信息 ===") + net_info = get_network_info() + print(f"已发送: {net_info['bytes_sent'] // (1024 * 1024)} MB") + print(f"已接收: {net_info['bytes_recv'] // (1024 * 1024)} MB") + +if __name__ == "__main__": + main() + +``` + +#### 3.参数解释 + + + +- `psutil`: Python 的系统和进程工具库,用于获取 CPU、内存、磁盘、网络等信息。 +- `socket`: 标准库模块,用于获取网络信息,如主机名。 +- `datetime`: 标准库模块,用于处理日期和时间,例如计算开机时长。 + +------ + +## 🧠 获取 CPU 信息 + +```python +def get_cpu_info(): +``` + +定义一个函数 `get_cpu_info`,用来收集 CPU 的使用信息。 + +```python +return { + "cpu_percent": psutil.cpu_percent(interval=1), +``` + +- `psutil.cpu_percent(interval=1)`:统计 1 秒钟内 CPU 的总体使用率(百分比)。 + +```python + "cpu_cores": psutil.cpu_count(logical=False), +``` + +- `psutil.cpu_count(logical=False)`:获取物理核心数,不包含超线程。 + +```python + "cpu_threads": psutil.cpu_count(logical=True) +``` + +- `psutil.cpu_count(logical=True)`:获取逻辑核心数(包括超线程)。 + +返回一个包含三个键值的字典。 + +------ + +## 💾 获取内存信息 + +```python +def get_memory_info(): +``` + +定义函数 `get_memory_info`,收集内存使用情况。 + +```python + mem = psutil.virtual_memory() +``` + +- 调用 `virtual_memory()` 获取当前系统的内存使用信息,返回一个包含多个字段的对象。 + +```python + return { + "total": mem.total, + "available": mem.available, + "used": mem.used, + "percent": mem.percent + } +``` + +- 提取并返回 `total`(总内存)、`available`(可用)、`used`(已用)和 `percent`(使用率)这几个重要指标,作为字典返回。 + +------ + +## 📁 获取磁盘使用情况 + +```python +def get_disk_info(): +``` + +定义函数 `get_disk_info`,用来收集磁盘每个分区的使用状态。 + +```python +partitions = psutil.disk_partitions() +``` + +- 获取所有磁盘分区(如 `/`, `/boot`)。 + +```python +disk_info = {} +``` + +- 初始化一个空字典,用来存储每个挂载点的使用信息。 + +```python + for p in partitions: +``` + +- 遍历所有磁盘分区。 + +```python + usage = psutil.disk_usage(p.mountpoint) +``` + +- 获取该分区的使用情况(总空间、已用、可用、百分比)。 + +```python + disk_info[p.mountpoint] = { + "total": usage.total, + "used": usage.used, + "free": usage.free, + "percent": usage.percent + } +``` + +- 把该挂载点的使用数据以字典形式存入 `disk_info` 中,以挂载点路径为键。 + +```python + return disk_info +``` + +- 返回整个磁盘信息的字典。 + +------ + +## 🌐 获取网络信息 + +```python +def get_network_info(): +``` + +定义函数 `get_network_info`,收集网络数据使用情况。 + +```python + net_io = psutil.net_io_counters() +``` + +- 获取网络接口的总体读写统计(从开机到现在)。 + +```python + return { + "bytes_sent": net_io.bytes_sent, + "bytes_recv": net_io.bytes_recv + } +``` + +- 返回已发送和接收的总字节数。 + +------ + +## ⏱️ 获取系统运行时间 + +```python +def get_uptime(): +``` + +定义函数 `get_uptime`,计算系统运行了多久。 + +```python + boot_time = datetime.datetime.fromtimestamp(psutil.boot_time()) +``` + +- `psutil.boot_time()` 返回系统开机时间(Unix 时间戳)。 +- `fromtimestamp()` 将其转换为 `datetime` 对象。 + +```python + now = datetime.datetime.now() +``` + +- 获取当前时间。 + +```python +return str(now - boot_time).split('.')[0] +``` + +- 计算时间差(即运行时长),去掉微秒部分并转为字符串返回。 + +------ + +## 🖥️ 获取主机名 + +```python +def get_hostname(): + return socket.gethostname() +``` + +使用 `socket.gethostname()` 返回本机的主机名。 + +------ + +## 🔁 主程序入口 + +```python +def main(): +``` + +定义主函数,控制整个程序流程。 + +```python +print(f"主机名: {get_hostname()}") +``` + +打印主机名。 + +```python + print(f"系统运行时间: {get_uptime()}") +``` + +打印系统开机至今的运行时间。 + +------ + +### ▶️ 打印 CPU 信息 + +```python + print("\n=== CPU 信息 ===") +``` + +打印 CPU 信息的标题。 + +```python + for k, v in get_cpu_info().items(): + print(f"{k}: {v}") +``` + +- 遍历 CPU 信息字典并打印每项的键和值。 + +------ + +### 🧠 打印内存信息 + +```python + print("\n=== 内存 信息 ===") +``` + +标题。 + +```python + for k, v in get_memory_info().items(): + print(f"{k}: {v // (1024 * 1024)} MB") +``` + +- 遍历内存数据,将字节转换为 MB 后打印。 + +------ + +### 💽 打印磁盘信息 + +```python + print("\n=== 磁盘 信息 ===") +``` + +标题。 + +```python + disk_info = get_disk_info() +``` + +获取磁盘信息。 + +```python + for mount, info in disk_info.items(): +``` + +遍历每个挂载点及其信息。 + +```python +print(f"\n挂载点: {mount}") +``` + +打印当前磁盘分区的挂载点。 + +```python +for k, v in info.items(): +``` + +遍历该挂载点的信息。 + +```python + if isinstance(v, (int, float)): + print(f" {k}: {v // (1024 * 1024)} MB" if 'percent' not in k else f" {k}: {v}%") + else: + print(f" {k}: {v}") +``` + +- 如果值是数字,就转成 MB 打印(除了百分比)。 +- 否则直接打印。 + +------ + +### 🌐 打印网络信息 + +```python + print("\n=== 网络 信息 ===") + net_info = get_network_info() +``` + +获取网络流量。 + +```python + print(f"已发送: {net_info['bytes_sent'] // (1024 * 1024)} MB") + print(f"已接收: {net_info['bytes_recv'] // (1024 * 1024)} MB") +``` + +将字节转换为 MB 并打印发送和接收量。 + +------ + +## 🚀 执行入口 + +```python +if __name__ == "__main__": + main() +``` + +- Python 程序的标准入口。 +- 如果是直接运行脚本,就执行 `main()`。 +