别被官方文档忽悠了
说实话,Redfish 的 DMTF 官方文档我看过不下十遍。写得跟法律条文似的——严谨是严谨,但你真要在生产环境配起来,踩的坑能把你心态搞崩。
上周我们团队刚把一套 48 节点的集群从 IPMI 迁移到 Redfish,过程堪称大型翻车现场。这篇文章就是我拿命换来的经验总结,2026 年的最佳实践,没有之一。
Redfish 到底是什么?
简单说,Redfish 就是现代服务器管理的 RESTful API 标准。取代了老掉牙的 IPMI,基于 HTTPS+JSON,不用再跟 IPMI 那堆二进制协议死磕了。
DMTF 官方定义是“为融合、混合 IT 和软件定义数据中心设计的简单安全管理标准”。翻译成人话:用 HTTP 请求就能控制服务器的一切——从 BIOS 设置到固件升级,从电源管理到传感器监控。
2026 年你该知道的 Redfish 现状
硬件厂商支持情况
| 厂商 | Redfish 版本 | 实测稳定性 | 坑点 |
|---|---|---|---|
| Dell iDRAC 9+ | 2024.3 | ⭐⭐⭐⭐ | 部分旧固件返回格式不标准 |
| HPE iLO 6+ | 2024.2 | ⭐⭐⭐⭐⭐ | 文档最清晰,但授权贵 |
| Supermicro BMC | 2024.1 | ⭐⭐⭐ | 部分端点返回 500,需重试 |
| Lenovo XClarity | 2024.3 | ⭐⭐⭐⭐ | 配置变更后需手动重启 BMC |
| Inspur | 2023.x | ⭐⭐ | 兼容性最差,踩坑无数 |
Super 的 Redfish API 在 2026 年更新了,但说实话有些端点还是会莫名其妙返回 500。我们的做法是加了个重试机制——三次重试加指数退避,基本能解决 95% 的问题。
第一步:基础配置
1. 启用 Redfish 服务
不同厂商的启用方式不一样,但基本都在 BMC/iDRAC/iLO 的 Web 界面里。以 Dell iDRAC9 为例:
- 登录 iDRAC Web 界面
- 进入 Configuration → Network Settings
- 确保 IPMI over LAN 开启(Redfish 依赖这个)
- 启用 Web Server(HTTPS 端口默认 443)
踩坑提醒:有些厂商默认只开了 Redfish 只读模式。你要去 Settings → Redfish 里把 Write Mode 打开,不然只能 GET 不能 PATCH。
2. 创建专用 API 用户
永远不要用 root/admin 账号跑自动化脚本。这是基本素养。
# 通过 Redfish API 创建只读用户
curl -k -X POST https://<BMC_IP>/redfish/v1/AccountService/Accounts \
-H "Content-Type: application/json" \
-u "admin:your_admin_password" \
-d '{
"UserName": "monitor_user",
"Password": "SecurePass123!",
"RoleId": "ReadOnly",
"Enabled": true
}'
# 创建运维操作用户
curl -k -X POST https://<BMC_IP>/redfish/v1/AccountService/Accounts \
-H "Content-Type: application/json" \
-u "admin:your_admin_password" \
-d '{
"UserName": "ops_user",
"Password": "AnotherSecurePass456!",
"RoleId": "Operator",
"Enabled": true
}'
第二步:核心 API 端点实战
获取系统信息
这是你第一个要调通的 API:
# 获取系统基本信息
curl -sk https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1 \
-u "ops_user:password" | jq .
# 提取关键信息
curl -sk https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1 \
-u "ops_user:password" | jq '{Model, Manufacturer, BiosVersion, MemorySummary, ProcessorSummary}'
注意:不同厂商的系统 ID 不一样。Dell 是 System.Embedded.1,HPE 是 1,Supermicro 是 1U 或 1。别写死,先 GET /redfish/v1/Systems/ 看看返回了什么。
电源管理
这功能我天天用。远程重启挂掉的服务器,一分钟搞定。
# 优雅关机
curl -sk -X POST https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset \
-H "Content-Type: application/json" \
-u "ops_user:password" \
-d '{"ResetType": "GracefulShutdown"}'
# 强制重启(死机专用)
curl -sk -X POST https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset \
-H "Content-Type: application/json" \
-u "ops_user:password" \
-d '{"ResetType": "ForceRestart"}'
ResetType 参数说明:
| 类型 | 行为 | 适用场景 |
|---|---|---|
On | 开机 | 服务器已关机时 |
GracefulShutdown | 优雅关机 | 正常维护 |
ForceRestart | 强制重启 | 系统无响应 |
ForceOff | 强制断电 | 紧急情况 |
PowerCycle | 断电再开机 | 深度重置 |
BIOS 配置管理
这玩意儿救过我一命。以前配 BIOS 得一台台手动进界面,现在一条命令搞定一批。
# 查看当前 BIOS 配置
curl -sk https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1/Bios \
-u "ops_user:password" | jq '.Attributes | {BootMode, ProcTurboMode, ProcVirtualization}'
# 修改 BIOS 设置(需要先获取待修改属性的正确路径)
curl -sk -X PATCH https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1/Bios/Settings \
-H "Content-Type: application/json" \
-u "ops_user:password" \
-d '{
"Attributes": {
"BootMode": "Uefi",
"ProcTurboMode": "Enabled",
"ProcVirtualization": "Enabled"
}
}'
# 然后需要重启服务器使 BIOS 设置生效
# 查看待处理的任务状态
curl -sk https://<BMC_IP>/redfish/v1/Systems/System.Embedded.1/Bios/Settings \
-u "ops_user:password" | jq '.Attributes'
踩坑记录:BIOS 属性名在不同厂商之间完全不统一。Dell 叫 BootMode,HPE 可能叫 BootMode 但值不一样。我建议你先 GET 出完整配置,搜索关键词找到对应属性名,再 PATCH。
固件升级
这操作风险最大,一旦失败服务器可能直接变砖。
# 1. 上传固件到 BMC
curl -sk -X POST https://<BMC_IP>/redfish/v1/UpdateService/UpdateActions/SimpleUpdate \
-H "Content-Type: application/json" \
-u "ops_user:password" \
-d '{
"ImageURI": "https://your-ftp-server/firmware/BIOS_XXXX.bin",
"@Redfish.OperationApplyTime": "OnReset"
}'
# 2. 查看升级任务状态
curl -sk https://<BMC_IP>/redfish/v1/TaskService/Tasks/<TaskID> \
-u "ops_user:password" | jq '.TaskState, .PercentComplete'
我的铁律:
- 永远不要在业务高峰期升级固件
- 先升级一台测试机,观察 24 小时
- 准备回滚方案——有些厂商支持,有些不支持
- 升级期间不要断电,UPS 必须正常
第三步:自动化脚本实战
Python 示例
我们实际用的脚本,简化版:
import requests
import json
import time
from requests.auth import HTTPBasicAuth
from urllib3.exceptions import InsecureRequestWarning
# 生产环境别关 SSL 验证!这里是测试用
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
class RedfishManager:
def __init__(self, bmc_ip, username, password):
self.base_url = f"https://{bmc_ip}/redfish/v1"
self.auth = HTTPBasicAuth(username, password)
self.session = requests.Session()
self.session.auth = self.auth
self.session.verify = False
# 设置超时,防止 BMC 无响应卡死
self.session.timeout = (10, 30)
def get_system_info(self, system_id="System.Embedded.1"):
"""获取系统信息"""
url = f"{self.base_url}/Systems/{system_id}"
resp = self.session.get(url)
resp.raise_for_status()
return resp.json()
def power_action(self, system_id, action):
"""执行电源操作"""
url = f"{self.base_url}/Systems/{system_id}/Actions/ComputerSystem.Reset"
payload = {"ResetType": action}
resp = self.session.post(url, json=payload)
resp.raise_for_status()
return resp.status_code
def set_bios_attribute(self, system_id, attributes):
"""设置 BIOS 属性"""
url = f"{self.base_url}/Systems/{system_id}/Bios/Settings"
payload = {"Attributes": attributes}
resp = self.session.patch(url, json=payload)
resp.raise_for_status()
return resp.status_code
def get_thermal_info(self, chassis_id="Chassis.System.Embedded.1"):
"""获取温度传感器数据"""
url = f"{self.base_url}/Chassis/{chassis_id}/Thermal"
resp = self.session.get(url)
resp.raise_for_status()
data = resp.json()
# 提取所有温度传感器
sensors = []
for temp in data.get("Temperatures", []):
sensors.append({
"name": temp["Name"],
"reading": temp["ReadingCelsius"],
"status": temp["Status"]["Health"]
})
return sensors
def update_firmware(self, image_uri):
"""固件升级"""
url = f"{self.base_url}/UpdateService/Actions/UpdateService.SimpleUpdate"
payload = {
"ImageURI": image_uri,
"@Redfish.OperationApplyTime": "OnReset"
}
resp = self.session.post(url, json=payload)
resp.raise_for_status()
# 获取任务 ID
task_url = resp.headers.get("Location")
return task_url
# 使用示例
if __name__ == "__main__":
mgr = RedfishManager("192.168.1.100", "ops_user", "SecurePass456!")
# 获取系统信息
info = mgr.get_system_info()
print(f"服务器型号: {info.get('Model')}")
print(f"BIOS 版本: {info.get('BiosVersion')}")
# 获取温度
sensors = mgr.get_thermal_info()
for s in sensors:
print(f"{s['name']}: {s['reading']}°C [{s['status']}]")
# 重启服务器(谨慎操作!)
# mgr.power_action("System.Embedded.1", "GracefulShutdown")
# time.sleep(60)
# mgr.power_action("System.Embedded.1", "On")
第四步:生产环境最佳实践
安全配置
这是 2026 年最容易被忽略的。我见过太多人直接在公网暴露 BMC 端口。
| 配置项 | 推荐设置 | 原因 |
|---|---|---|
| HTTPS | 强制开启,禁用 HTTP | 明文传输密码太危险 |
| TLS 版本 | 最低 TLS 1.2 | TLS 1.0/1.1 已废弃 |
| 密码策略 | 12 位以上,含特殊字符 | 暴力破解防护 |
| 访问控制 | IP 白名单 | 只允许管理网段访问 |
| 会话超时 | 15 分钟 | 减少会话劫持风险 |
| 审计日志 | 开启 | 追踪谁做了什么操作 |
监控与告警
我们 Prometheus 直接通过 Redfish 采集数据:
# prometheus.yml 中的 redfish 采集配置
scrape_configs:
- job_name: 'redfish_hardware'
scrape_interval: 60s
metrics_path: '/redfish/v1/Chassis/Chassis.System.Embedded.1/Thermal'
scheme: https
basic_auth:
username: 'monitor_user'
password: 'SecurePass123!'
tls_config:
insecure_skip_verify: true # 生产环境请用合法证书
relabel_configs:
- source_labels: [__address__]
target_label: instance
常见故障处理
问题 1:API 返回 500 Internal Server Error
大概率是 BMC 固件 bug。我们碰到过 Supermicro 的 /redfish/v1/Systems/1 随机返回 500。
解决方案:
import time
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def safe_redfish_get(url, auth):
resp = requests.get(url, auth=auth, verify=False, timeout=30)
resp.raise_for_status()
return resp.json()
问题 2:PATCH BIOS 设置后不生效
有些厂商的 BIOS 设置需要重启后才会应用。而且重启后还要等 BMC 重新加载配置。
正确流程:
- PATCH BIOS/Settings
- 重启服务器
- 等待 60 秒
- GET BIOS 验证配置
问题 3:会话过期
Redfish 的会话默认 30 分钟过期。长时间运行的脚本要做好会话管理。
# 创建会话
session_resp = requests.post(
f"{base_url}/SessionService/Sessions",
json={"UserName": username, "Password": password},
verify=False
)
token = session_resp.headers["X-Auth-Token"]
# 使用 token 进行后续请求
headers = {"X-Auth-Token": token}
resp = requests.get(f"{base_url}/Systems", headers=headers, verify=False)
2026 年 Redfish 生态趋势
说实话,2026 年的 Redfish 生态比三年前成熟太多了。几乎所有主流服务器厂商都原生支持,不再需要额外装插件。
但坑依然不少:
- 标准不统一:DMTF 出了标准,但厂商实现各有千秋。同一个端点,不同厂商返回的 JSON 结构可能不一样
- 性能问题:有些低端 BMC 的 Redfish 响应速度感人,一个 GET 请求能跑 5 秒
- 文档质量:厂商文档质量参差不齐。Dell 的还算能看,有些小厂的根本没法用
FAQ
Q: Redfish 和 IPMI 有什么区别?
A: IPMI 基于底层协议,需要专用工具(如 ipmitool)。Redfish 基于 HTTPS+JSON,用 curl 就能操作。Redfish 更现代化,支持更丰富的管理功能,但 IPMI 在某些场景下响应更快。
Q: 如何确认我的服务器支持 Redfish?
A: 直接访问 https://<BMC_IP>/redfish/v1/。如果返回 JSON 数据就支持。如果不支持,考虑升级 BMC 固件。
Q: Redfish 安全吗?
A: 安全取决于你的配置。HTTPS 加密传输,支持 RBAC 权限控制,有审计日志。但前提是你没把 BMC 暴露在公网上。
Q: 需要什么工具来使用 Redfish?
A: 最基本的:curl + jq。高级点用 Python requests 库或 PowerShell。不需要额外安装客户端。
Q: 批量管理多台服务器怎么做?
A: 写脚本循环调用。我们用的 Ansible 有 redfish_config 模块,可以直接批量操作。也可以自己写 Python 脚本,配合并发库(如 asyncio)提升效率。
总结
Redfish 是服务器管理的未来,2026 年已经是标配了。从 IPMI 迁移过来可能会踩坑,但一旦跑顺了,效率提升是质的飞跃。
记住三条铁律:
- 安全第一:永远不要在公网暴露 BMC
- 测试先行:先在测试环境验证所有操作
- 文档为王:记录你踩过的每一个坑,下次就是经验
最后,别信那些吹得天花乱坠的厂商文档。实际动手试,踩坑了回来看看这篇文章,至少能帮你省半天时间。