运维笔记

Redfish API 配置实战指南 2026:从入门到生产级部署

Infrastructure 技术可视化

别被官方文档忽悠了

说实话,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 BMC2024.1⭐⭐⭐部分端点返回 500,需重试
Lenovo XClarity2024.3⭐⭐⭐⭐配置变更后需手动重启 BMC
Inspur2023.x⭐⭐兼容性最差,踩坑无数

Super 的 Redfish API 在 2026 年更新了,但说实话有些端点还是会莫名其妙返回 500。我们的做法是加了个重试机制——三次重试加指数退避,基本能解决 95% 的问题。

第一步:基础配置

1. 启用 Redfish 服务

不同厂商的启用方式不一样,但基本都在 BMC/iDRAC/iLO 的 Web 界面里。以 Dell iDRAC9 为例:

  1. 登录 iDRAC Web 界面
  2. 进入 ConfigurationNetwork Settings
  3. 确保 IPMI over LAN 开启(Redfish 依赖这个)
  4. 启用 Web Server(HTTPS 端口默认 443)

踩坑提醒:有些厂商默认只开了 Redfish 只读模式。你要去 SettingsRedfish 里把 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 是 1U1。别写死,先 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.2TLS 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 重新加载配置。

正确流程:

  1. PATCH BIOS/Settings
  2. 重启服务器
  3. 等待 60 秒
  4. 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 迁移过来可能会踩坑,但一旦跑顺了,效率提升是质的飞跃。

记住三条铁律:

  1. 安全第一:永远不要在公网暴露 BMC
  2. 测试先行:先在测试环境验证所有操作
  3. 文档为王:记录你踩过的每一个坑,下次就是经验

最后,别信那些吹得天花乱坠的厂商文档。实际动手试,踩坑了回来看看这篇文章,至少能帮你省半天时间。