Deepseek生成Python代码
(由于技术原因,联网搜索暂不可用)
·
(由于技术原因,联网搜索暂不可用)
以下是根据需求定制的完整解决方案,实现从多台服务器抓取内存信息并按内存大小排序输出:
步骤 1:创建服务器配置文件(servers.json)
[
{
"name": "WebServer-01",
"host": "192.168.1.101",
"user": "admin",
"password": "common_password"
},
{
"name": "DBServer-01",
"host": "192.168.1.102",
"user": "admin",
"password": "common_password"
}
]
步骤 2:Python 代码(get_memory.py)
import json
from fabric import Connection
from concurrent.futures import ThreadPoolExecutor
# 读取服务器配置
with open("servers.json") as f:
servers = json.load(f)
def get_server_memory(server):
"""连接服务器并获取内存信息"""
try:
# 建立SSH连接
with Connection(
host=server["host"],
user=server["user"],
connect_kwargs={"password": server["password"]},
connect_timeout=10
) as conn:
# 执行命令获取内存(单位:MB)
result = conn.run("free -m | awk '/Mem/{print $2}'", hide=True)
total_mem_mb = int(result.stdout.strip())
return {
"name": server["name"],
"memory_mb": total_mem_mb,
"error": None
}
except Exception as e:
return {
"name": server["name"],
"memory_mb": None,
"error": str(e)
}
# 并发获取所有服务器的内存信息
results = []
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(get_server_memory, server) for server in servers]
results = [future.result() for future in futures]
# 过滤成功的结果并按内存从大到小排序
success_results = [r for r in results if r["error"] is None]
sorted_results = sorted(success_results, key=lambda x: x["memory_mb"], reverse=True)
# 打印排序后的结果
print("===== 服务器内存大小排名 =====")
for idx, server in enumerate(sorted_results, 1):
print(f"{idx}. {server['name']} - 内存: {server['memory_mb']} MB")
# 打印错误信息
errors = [r for r in results if r["error"]]
if errors:
print("\n===== 错误信息 =====")
for err in errors:
print(f"{err['name']} 失败:{err['error']}")
步骤 3:运行代码
python get_memory.py
输出示例
===== 服务器内存大小排名 =====
1. DBServer-01 - 内存: 8192 MB
2. WebServer-01 - 内存: 4096 MB
===== 错误信息 =====
BackupServer-01 失败:SSH connect timed out.
关键功能说明
-
统一认证管理
- 所有服务器共享相同的用户名和密码,通过 JSON 文件集中配置。
-
内存信息抓取
- 使用命令
free -m | awk '/Mem/{print $2}'
直接提取总内存(MB)。 - 数值转换为整型便于排序。
- 使用命令
-
并发与排序
- 通过
ThreadPoolExecutor
实现多线程并发连接。 - 结果按内存大小降序排列(从大到小)。
- 通过
-
错误隔离处理
- 分离成功结果与错误信息,确保部分服务器故障不影响整体流程。
扩展建议
-
单位转换
如需显示为 GB,可修改代码:total_mem_gb = round(total_mem_mb / 1024, 2) print(f"{server['name']} - 内存: {total_mem_gb} GB")
-
更健壮的解析
使用正则表达式处理不同格式的输出:import re mem_output = conn.run("free -m", hide=True).stdout match = re.search(r"Mem:\s+(\d+)", mem_output) total_mem_mb = int(match.group(1)) if match else 0
-
结果持久化
将结果保存到 CSV 文件:import csv with open("memory_report.csv", "w") as f: writer = csv.writer(f) writer.writerow(["排名", "服务器名", "内存(MB)"]) for idx, server in enumerate(sorted_results, 1): writer.writerow([idx, server["name"], server["memory_mb"]])
注意事项
- 安全性:建议将密码通过环境变量传递,避免明文存储:
import os password = os.environ.get("COMMON_SSH_PASSWORD") # 在代码中动态填充 servers.json 中的 password 字段
- 超时调整:根据网络情况调整
connect_timeout
参数。 - 兼容性:确保目标服务器的
free
命令输出格式一致。
更多推荐
所有评论(0)