4. 基于Redfish的服务器批量信息采集
当机房中只有两三台 PowerEdge 服务器时,登录 iDRAC 网页逐台查看型号、序列号和固件版本并不费力;但当规模上升到几十台甚至上百台时,人工点选就完全不可行了。Redfish 的价值正在于此:它把每台服务器 BMC(在 Dell 服务器上即 iDRAC)的管理能力抽象成一套统一的 RESTful 接口,返回结构化 JSON。我们只要写一段脚本,循环访问每台服务器的同一个 URI,就能把型号、序列号、CPU、内存、磁盘、固件版本和健康状态一次性采集下来,汇总成 CSV 或 JSON 报告。
本节的核心不是“调用某个接口”,而是建立一条可复用的采集链路:认证 → 遍历资源树 → 提取字段 → 归一化 → 输出报告。理解这条链路,比记住某个具体 URL 更重要。
一、Redfish 资源树与关键采集路径
Redfish 的数据模型是一棵树。访问 https://<iDRAC_IP>/redfish/v1/ 会得到服务根(ServiceRoot),其中 Systems、Chassis、Managers、UpdateService 等集合是主要入口。对 PowerEdge 而言,最常用的采集路径如下:
/redfish/v1/Systems/System.Embedded.1:主机型号(Model)、序列号(SerialNumber)、电源状态(PowerState)、内存总量(MemorySummary.TotalSystemMemoryGiB)、处理器概要(ProcessorSummary)、整体健康(Status.Health)。/redfish/v1/Systems/System.Embedded.1/Processors:逐颗 CPU 的型号、核心数、主频、健康状态。/redfish/v1/Systems/System.Embedded.1/Memory:每条 DIMM 的容量、速率、厂商、位置、健康状态。/redfish/v1/Systems/System.Embedded.1/Storage:控制器及其下挂的物理磁盘(Drives)和虚拟磁盘(Volumes)。/redfish/v1/Managers/iDRAC.Embedded.1:iDRAC 固件版本(FirmwareVersion)、iDRAC 健康状态。/redfish/v1/UpdateService/FirmwareInventory:BIOS、iDRAC、网卡、RAID 控制器等各部件的固件版本清单。
注意:System.Embedded.1 和 iDRAC.Embedded.1 是 Dell 的固定实例 ID,绝大多数 PowerEdge 机型通用,但严谨的脚本应先请求 /Systems 集合,读取 Members 数组中的 @odata.id,再逐项访问,这样对多系统或未来机型更健壮。
二、认证方式:Session 优于 Basic
Redfish 支持 HTTP Basic 认证,即每次请求都带上 Authorization: Basic base64(user:password)。这种方式实现简单,但明文凭据在每次请求中重复传输,且 iDRAC 对并发 Basic 请求较敏感。更规范的做法是先创建会话:
POST https://<iDRAC_IP>/redfish/v1/SessionService/Sessions
Body: {"UserName": "root", "Password": "calvin"}
响应头 X-Auth-Token: <token>
后续请求携带: X-Auth-Token: <token>
采集结束后 DELETE 该会话 URL 释放资源
批量采集时,建议每台服务器建立一个会话,采集完立即删除,避免会话数累积触发 iDRAC 上限(通常为 8~16 个)。
三、Python 批量采集实现
下面是一段可直接运行的示例脚本,使用 requests 库,采集多台服务器并输出 CSV。示例中的 IP、账号为教学假设值,请替换为实际环境。
import requests, csv, json
from requests.auth import HTTPBasicAuth
requests.packages.urllib3.disable_warnings()
IDRAC_USER, IDRAC_PASS = "root", "calvin"
HOSTS = ["192.168.10.11", "192.168.10.12", "192.168.10.13"]
def get(ip, path, token):
url = f"https://{ip}/redfish/v1{path}"
r = requests.get(url, headers={"X-Auth-Token": token},
verify=False, timeout=15)
r.raise_for_status()
return r.json()
def collect(ip):
base = f"https://{ip}/redfish/v1"
s = requests.post(base + "/SessionService/Sessions",
json={"UserName": IDRAC_USER, "Password": IDRAC_PASS},
verify=False, timeout=15)
s.raise_for_status()
token = s.headers["X-Auth-Token"]
session_url = s.headers["Location"]
try:
sys = get(ip, "/Systems/System.Embedded.1", token)
mgr = get(ip, "/Managers/iDRAC.Embedded.1", token)
fw = get(ip, "/UpdateService/FirmwareInventory", token)
bios = next((m["Version"] for m in fw["Members"]
if "BIOS" in m["Id"]), "")
return {
"IP": ip,
"型号": sys.get("Model"),
"序列号": sys.get("SerialNumber"),
"CPU型号": sys["ProcessorSummary"].get("Model"),
"CPU核数": sys["ProcessorSummary"].get("Count"),
"内存GiB": sys["MemorySummary"].get("TotalSystemMemoryGiB"),
"BIOS版本": bios,
"iDRAC版本": mgr.get("FirmwareVersion"),
"健康状态": sys["Status"].get("Health"),
}
finally:
requests.delete(session_url, headers={"X-Auth-Token": token},
verify=False)
rows = [collect(ip) for ip in HOSTS]
with open("inventory.csv", "w", newline="", encoding="utf-8-sig") as f:
w = csv.DictWriter(f, fieldnames=rows[0].keys())
w.writeheader(); w.writerows(rows)
print(json.dumps(rows, ensure_ascii=False, indent=2))
几个工程细节值得强调:verify=False 是因为 iDRAC 默认使用自签名证书,生产环境应导入 CA 证书后改为 verify="ca.pem";timeout=15 防止某台离线服务器拖死整个循环;encoding="utf-8-sig" 让 Excel 打开 CSV 时中文不乱码;finally 块确保即使采集异常也会删除会话。
四、PowerShell 等价实现
在 Windows 运维环境中,PowerShell 更贴近日常习惯。PowerShell 7 的 Invoke-RestMethod 原生支持 JSON 与跳过证书校验:
$hosts = "192.168.10.11","192.168.10.12","192.168.10.13"
$cred = @{ UserName="root"; Password="calvin" } | ConvertTo-Json
$result = foreach ($ip in $hosts) {
$base = "https://$ip/redfish/v1"
$s = Invoke-RestMethod "$base/SessionService/Sessions" -Method Post `
-Body $cred -ContentType "application/json" -SkipCertificateCheck
$h = @{ "X-Auth-Token" = $s.Headers["X-Auth-Token"] }
$sys = Invoke-RestMethod "$base/Systems/System.Embedded.1" `
-Headers $h -SkipCertificateCheck
[pscustomobject]@{
IP=$ip; 型号=$sys.Model; 序列号=$sys.SerialNumber
CPU=$sys.ProcessorSummary.Model; 内存GiB=$sys.MemorySummary.TotalSystemMemoryGiB
健康=$sys.Status.Health
}
}
$result | Export-Csv inventory.csv -NoTypeInformation -Encoding UTF8
五、采集链路与字段映射
下图把上述过程抽象为一条数据流:脚本对每台 iDRAC 建立会话,沿资源树并行拉取四类数据源,归一化后写入统一报告。图中同时标出了各字段的来源路径,便于排障时快速定位。
六、结果判读与常见问题
采集完成后,报告本身要能回答三个问题:资产是否齐全、配置是否一致、健康是否异常。建议在 CSV 中增加一列“采集状态”,记录成功、超时或认证失败,避免把失败误判为“该服务器没有数据”。
常见异常与判断依据:
- 401 Unauthorized:账号密码错误,或该 iDRAC 启用了账户锁定策略。检查是否因并发过高触发锁定。
- 超时无响应:iDRAC 网络不通或正在重启。可先用
ping与Test-NetConnection <ip> -Port 443确认。 - 字段为空:某些机型或固件版本对
ProcessorSummary.Model返回空值,此时应回退到/Processors集合逐颗读取。 - 健康状态为 Unknown:通常是 iDRAC 尚未完成启动自检,等待 2~3 分钟后重试即可。
max_workers=8,同时为每台服务器设置独立超时,避免单点拖慢整体。把采集脚本纳入定时任务(如每天凌晨执行一次),输出的 CSV 就成了一份轻量级资产基线。后续做固件批量升级或配置合规检查时,只需将当前采集结果与基线比对,即可快速定位差异服务器,这正是下一阶段自动化运维的起点。