兄弟们,今天聊点硬核的——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 / IPMI | HTTPS (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 自动化多省时间。确实省,但有几个真相没人说:
- iDRAC 的 API 文档真的很烂。Dell 官方的 GitHub 仓库 dell/iDRAC-Redfish-Scripting 有一些示例,但很多 endpoint 的 payload 字段要靠试错才知道。
- 固件升级是最大的坑。Redfish 的
UpdateService端点可以升级固件,但如果你指向 Dell 的在线仓库,速度慢得令人发指。最好自建本地 FTP 或 HTTP 服务器放固件文件。 - 安全配置不能省。有人在 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 台服务器跑脚本——翻车的时候你会感谢我的。
最后送大家一句话:自动化不是银弹,但它能让你从重复劳动里解放出来,去做更有价值的事。
(比如——摸鱼。)