运维笔记

iDRAC 9 自动化脚本实战:用 Python 把 200 台 Dell 服务器管得服服帖帖

Infrastructure 技术可视化

兄弟们,今天聊点硬核的——iDRAC 9 自动化。

先别急着划走,我知道你肯定遇到过这种情况:几十上百台 PowerEdge 服务器堆在机房里,每台都得手动进 iDRAC 改 BIOS 配置、升级固件、设置网络。一个人干一整天,搞完腰都直不起来。

我去年接手了一个 200+ 节点的项目,每台机器都需要一模一样的 iDRAC 和 BIOS 配置。一开始想用 RACADM 凑合,但后来发现——Python + Redfish API 才是真香

为什么是 Redfish 而不是 RACADM?

RACADM 是老牌工具了,但说实话,它的 SSH 批量操作体验很糟心。尤其是跨平台的时候,Windows 和 Linux 的 RACADM 版本还不一样,踩坑踩到怀疑人生。

Redfish 是 RESTful API,基于 HTTPS,返回 JSON。Python 的 requests 库直接调,干净利落。

看看这个对比表:

特性RACADM (传统)Python + Redfish API
传输协议SSH / IPMIHTTPS (RESTful)
数据格式文本输出,需解析JSON,直接处理
跨平台需安装对应版本纯 Python,pip install requests
并发能力串行,慢可异步,快 10 倍
错误处理靠 grep 日志try/except + HTTP 状态码
学习曲线低(但扩展性差)中(但一劳永逸)

我选了 Redfish。原因很简单:我不想在 2026 年还去解析 SSH 的文本输出

实战:从零到自动化 200 台服务器

环境准备

pip install requests urllib3

就这么简单。不需要装 RACADM,不需要配 SSH key。

核心脚本骨架

这是我项目里最常用的一个函数——获取服务器信息:

import requests
import json
from requests.auth import HTTPBasicAuth

def get_idrac_data(idrac_ip, username, password, endpoint):
    url = f"https://{idrac_ip}/redfish/v1/{endpoint}"
    # 关闭 SSL 验证(生产环境应该用证书)
    response = requests.get(
        url,
        auth=HTTPBasicAuth(username, password),
        verify=False,
        timeout=30
    )
    response.raise_for_status()
    return response.json()

# 调用示例:获取系统信息
system_info = get_idrac_data("192.168.1.100", "root", "calvin", "Systems/System.Embedded.1")
print(json.dumps(system_info, indent=2))

注意verify=False 是偷懒写法。生产环境一定要配好 iDRAC 的 SSL 证书,不然安全审计过不去。

批量修改 BIOS 配置

这是真正的痛点。200 台服务器 BIOS 设置要一模一样,手动改得改到天荒地老。

Redfish 的 PendingAttributes 端点就是干这个的:

def set_bios_attribute(idrac_ip, username, password, attribute, value):
    url = f"https://{idrac_ip}/redfish/v1/Systems/System.Embedded.1/Bios/Settings"
    payload = {
        "Attributes": {
            attribute: value
        }
    }
    response = requests.patch(
        url,
        auth=HTTPBasicAuth(username, password),
        json=payload,
        verify=False,
        timeout=30
    )
    if response.status_code == 200 or response.status_code == 202:
        print(f"✅ {idrac_ip}: {attribute} 已设置为 {value}")
    else:
        print(f"❌ {idrac_ip}: 失败 - {response.status_code}")

# 批量设置所有服务器的 BootMode 为 UEFI
servers = ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
for ip in servers:
    set_bios_attribute(ip, "root", "calvin", "BootMode", "Uefi")

这个脚本跑完,200 台服务器 10 分钟搞定。要是手动改,一个人得干三天。

踩坑实录

坑 1:iDRAC 固件版本差异

iDRAC 9 不同固件版本的 Redfish Schema 有差异。比如某些老版本不支持 PendingAttributes,得用 Settings 端点。

解决方案:先查固件版本:

fw_info = get_idrac_data(ip, user, pwd, "Managers/iDRAC.Embedded.1")
print(f"固件版本: {fw_info['FirmwareVersion']}")

如果低于 4.x,某些 API 可能不兼容。别问我怎么知道的——生产环境翻车翻出来的教训。

坑 2:并发请求太多,iDRAC 直接挂掉

一开始我写了个 for 循环,一次性对 50 台服务器发请求。结果 iDRAC 直接不响应了——它的 HTTP 服务扛不住。

加个 time.sleep(0.5) 或者用 asyncio 控制并发数:

import time
from concurrent.futures import ThreadPoolExecutor

def batch_process(servers, func, max_workers=5):
    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        results = list(executor.map(func, servers))
    return results

5 个并发就够了。别贪心。

坑 3:修改 BIOS 后需要重启才能生效

这是个常识,但很多人会忘。Redfish 的 PendingAttributes 只是写入了暂存区,必须重启服务器才会真正应用。

用 Redfish 的 Actions/ComputerSystem.Reset 触发重启:

def reboot_server(idrac_ip, username, password):
    url = f"https://{idrac_ip}/redfish/v1/Systems/System.Embedded.1/Actions/ComputerSystem.Reset"
    payload = {"ResetType": "GracefulRestart"}
    response = requests.post(
        url,
        auth=HTTPBasicAuth(username, password),
        json=payload,
        verify=False,
        timeout=30
    )
    return response.status_code

那些 Reddit 上没人告诉你的真相

翻了一圈最近的讨论,发现大家都在吹 Python 自动化多省时间。确实省,但有几个真相没人说:

  1. iDRAC 的 API 文档真的很烂。Dell 官方的 GitHub 仓库 dell/iDRAC-Redfish-Scripting 有一些示例,但很多 endpoint 的 payload 字段要靠试错才知道。
  2. 固件升级是最大的坑。Redfish 的 UpdateService 端点可以升级固件,但如果你指向 Dell 的在线仓库,速度慢得令人发指。最好自建本地 FTP 或 HTTP 服务器放固件文件。
  3. 安全配置不能省。有人在 Reddit 上问 iDRAC 能不能直接连公网——千万别。iDRAC 的设计初衷就是放在独立的管理网络里。暴露到公网等于给黑客开后门。

最佳实践速查表

场景推荐做法不推荐的做法
批量 BIOS 配置Redfish PATCH PendingAttributes逐台手动进 BIOS
固件升级自建本地仓库 + Redfish SimpleUpdate在线仓库(太慢)
并发控制5-10 个线程,加延迟100+ 并发(iDRAC 会挂)
错误处理重试机制 + 日志记录直接抛异常不管
安全独立管理网 + SSL 证书公网直连 + 关闭验证
密码管理Vault/Ansible Vault硬编码在脚本里

FAQ

iDRAC 有 API 吗?

有。iDRAC 提供基于 Redfish 标准的 RESTful API,支持 JSON 格式。这是目前最推荐的自动化方式。RACADM 和 IPMI 也可以用,但 Redfish 是现代标准。

如何直接连接 iDRAC?

iDRAC 有专用的网络接口(通常是独立的以太网口),需要配置 IP 地址。通过浏览器访问 HTTPS 端口,或者通过 SSH/REST API 连接。默认用户是 root,密码是服务器机箱上的标签。

iDRAC 应该放在独立网络吗?

必须的。iDRAC 是带外管理接口,设计上就应该放在独立的管理 VLAN 里。直接连公网是找死——Dell 官方也是这个说法。

什么是 iDRAC Redfish?

Redfish 是一个 RESTful API 标准,用于管理服务器硬件。iDRAC 实现了这个标准,允许你通过 HTTP 请求获取传感器数据、修改 BIOS 设置、控制电源、升级固件等。简单说,就是让你用写 Web 应用的方式管理服务器。

写在最后

Python + iDRAC 9 Redfish API 这套组合拳,说实话,是我这几年做过 ROI 最高的自动化投入。200 行代码,省了一个运维干三天的活。

但别被那些吹得天花乱坠的教程骗了——这玩意儿坑不少。固件版本兼容性、并发限制、文档缺失,都是实打实的问题。

我的建议是:从小规模开始试。先拿三五台机器练手,把流程跑通,再推广到全量。别上来就对着 200 台服务器跑脚本——翻车的时候你会感谢我的。

最后送大家一句话:自动化不是银弹,但它能让你从重复劳动里解放出来,去做更有价值的事。

(比如——摸鱼。)