(由于技术原因,联网搜索暂不可用)

以下是根据需求定制的完整解决方案,实现从多台服务器抓取内存信息并按内存大小排序输出:


步骤 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.

关键功能说明

  1. 统一认证管理

    • 所有服务器共享相同的用户名和密码,通过 JSON 文件集中配置。
  2. 内存信息抓取

    • 使用命令 free -m | awk '/Mem/{print $2}' 直接提取总内存(MB)。
    • 数值转换为整型便于排序。
  3. 并发与排序

    • 通过 ThreadPoolExecutor 实现多线程并发连接。
    • 结果按内存大小降序排列(从大到小)。
  4. 错误隔离处理

    • 分离成功结果与错误信息,确保部分服务器故障不影响整体流程。

扩展建议

  1. 单位转换
    如需显示为 GB,可修改代码:

    total_mem_gb = round(total_mem_mb / 1024, 2)
    print(f"{server['name']} - 内存: {total_mem_gb} GB")
    
  2. 更健壮的解析
    使用正则表达式处理不同格式的输出:

    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
    
  3. 结果持久化
    将结果保存到 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 命令输出格式一致。
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐