别再用 Web 界面了,iLO 6 的 REST API 才是真生产力
说实话,我见过太多运维兄弟还在浏览器里点 iLO 的 Web 界面。点一下刷新,再点一下,一台两台还行,等你管着几百台 ProLiant 的时候,手指头都能点抽筋。
HPE iLO 6 的 RESTful API 基于 Redfish 标准,这东西不是 HPE 自己拍脑门搞的闭门造车,而是 DMTF(分布式管理任务组)定的行业标准。说白了,它就是一套通过 HTTP 请求(GET、PUT、POST、DELETE、PATCH)来管理服务器的接口,返回的是 JSON 格式的数据。
上周我们有个同事要批量更新 30 台 DL380 Gen10 的 BIOS 设置,手动操作得干一整天。我写了个 Python 脚本,调 iLO 6 的 REST API,中午吃饭前跑完,下午直接摸鱼。
这篇文章不讲虚的,全是踩坑经验。我会手把手教你从零开始调 iLO 6 的 API,然后自动化干点正事。
前置条件:别上来就翻车
先确认三件事,少一个都白扯:
- iLO 固件版本:必须 iLO 6 2.00 或更高。老版本 API 路径不一样,接口也少。你可以在 iLO Web 界面右上角看到固件版本。
- 许可证:iLO Standard 许可证够用,但有些高级功能(比如远程控制台、电源监控)需要 iLO Advanced 或更高。查看许可证状态:
GET /redfish/v1/Managers/1/LicenseService - 网络可达:你的管理机器和 iLO 管理口网络能通。别问,问就是有人把 iLO 口接在办公网但防火墙封了 443 端口。
第一步:Hello World —— 拿个系统信息试试水
打开你的终端,用 curl 发请求。iLO 6 默认启用 HTTPS,记得加 -k 跳过证书验证(生产环境建议配正经证书)。
curl -k -u "admin:你的密码" \
https://你的iLO-IP/redfish/v1/Systems/1
你应该能看到一坨 JSON,里面包含服务器型号、序列号、CPU 信息、内存总量等等。比如:
{
"Id": "1",
"Name": "ProLiant DL380 Gen10",
"Manufacturer": "HPE",
"Model": "ProLiant DL380 Gen10",
"SerialNumber": "USE1234ABC",
"ProcessorSummary": {
"Count": 2,
"Model": "Intel(R) Xeon(R) Gold 6248R"
},
"MemorySummary": {
"TotalSystemMemoryGiB": 384
}
}
踩坑记录:别用 curl 的 -v 模式直接把密码暴露在进程列表里。用 -u "admin:$(cat /etc/iLO_pass)" 或者干脆用 .netrc 文件。
第二步:搞懂 iLO 6 的 API 结构
iLO 6 的 API 根路径是 /redfish/v1/。下面这些是常用的资源节点:
| 路径 | 作用 | 常用操作 |
|---|---|---|
/Systems/1 | 服务器系统信息 | GET (查看), PATCH (修改引导顺序) |
/Managers/1 | iLO 自身管理 | GET (固件版本), PATCH (网络配置) |
/Chassis/1 | 机箱硬件 | GET (电源、风扇、温度) |
/Managers/1/VirtualMedia | 虚拟光驱 | GET, POST (挂载 ISO) |
/Managers/1/ActiveHealthSession | 主动健康检查 | GET (生成报告) |
/AccountService/Accounts | 用户账号管理 | GET, POST, DELETE |
关键点:iLO 6 的 Redfish API 是“有状态”的,某些操作(比如挂载 ISO)需要先 POST 创建 Session,拿到 X-Auth-Token,然后用这个 Token 做后续操作。
第三步:用 Session 认证,别每次都输密码
每次都输密码太 low 了,而且不安全。正规做法是创建 Session:
# 1. 创建 Session,拿到 Token
TOKEN=$(curl -sk -X POST https://你的iLO-IP/redfish/v1/SessionService/Sessions \
-H "Content-Type: application/json" \
-d '{"UserName": "admin", "Password": "你的密码"}' \
| jq -r '.Token')
# 2. 用 Token 发请求
curl -sk https://你的iLO-IP/redfish/v1/Systems/1 \
-H "X-Auth-Token: $TOKEN"
# 3. 用完记得删 Session
SESSION_URI=$(curl -sk https://你的iLO-IP/redfish/v1/SessionService/Sessions \
-H "X-Auth-Token: $TOKEN" | jq -r '.Members[0]."@odata.id"')
curl -sk -X DELETE "$SESSION_URI" \
-H "X-Auth-Token: $TOKEN"
注意:iLO 6 默认 Session 超时时间是 30 分钟无操作。你可以在 Managers/1/NetworkService 里改。
第四步:干点正事 —— 远程挂载 ISO 装系统
这是最常用的场景。挂载一个 ISO 镜像,然后设置服务器从虚拟光驱引导。
import requests
import json
ILO_IP = "192.168.1.100"
USER = "admin"
PASS = "your_password"
ISO_URL = "http://192.168.1.200/iso/debian-12.iso"
# 1. 创建 Session
session = requests.Session()
session.verify = False
resp = session.post(f"https://{ILO_IP}/redfish/v1/SessionService/Sessions",
json={"UserName": USER, "Password": PASS})
token = resp.headers.get("X-Auth-Token")
session.headers.update({"X-Auth-Token": token})
# 2. 插入虚拟光驱
# 注意:iLO 6 的 VirtualMedia 下可能有多个实例,比如 1 是 CD/DVD,2 是 USB
media_url = f"https://{ILO_IP}/redfish/v1/Managers/1/VirtualMedia/1/Actions/VirtualMedia.InsertMedia"
payload = {
"Image": ISO_URL,
"Inserted": True
}
resp = session.post(media_url, json=payload)
print(f"Insert media: {resp.status_code}")
# 3. 设置一次性从虚拟光驱引导
boot_url = f"https://{ILO_IP}/redfish/v1/Systems/1"
boot_payload = {
"Boot": {
"BootSourceOverrideTarget": "Cd",
"BootSourceOverrideEnabled": "Once"
}
}
resp = session.patch(boot_url, json=boot_payload)
print(f"Set boot override: {resp.status_code}")
# 4. 重启服务器
reset_url = f"https://{ILO_IP}/redfish/v1/Systems/1/Actions/ComputerSystem.Reset"
reset_payload = {"ResetType": "ForceRestart"}
resp = session.post(reset_url, json=reset_payload)
print(f"Reset: {resp.status_code}")
# 5. 清理 Session
session.delete(f"https://{ILO_IP}/redfish/v1/SessionService/Sessions")
翻车警告:BootSourceOverrideTarget 的值在不同固件版本里可能不一样。iLO 6 里 Cd 代表虚拟光驱,Usb 代表虚拟 USB 设备。我见过有人写成 CD 结果一直不生效的——大小写敏感。
第五步:批量抓取硬件健康状态
管 100 台机器的时候,你不可能一台一台登录 iLO 看。写个脚本批量抓 Chassis/1 下的温度、风扇、电源信息,然后扔进 Prometheus 或者直接告警。
#!/bin/bash
# 批量检查所有 iLO 的硬件健康
HOSTS=("ilo-01.example.com" "ilo-02.example.com" "ilo-03.example.com")
PASS="your_ilo_pass"
for host in "${HOSTS[@]}"; do
echo "=== $host ==="
# 获取电源状态
curl -sk -u "admin:$PASS" \
"https://$host/redfish/v1/Chassis/1/Power" \
| jq '{PowerSupply: [.PowerSupplies[] | {Name, Status}]}'
# 获取温度
curl -sk -u "admin:$PASS" \
"https://$host/redfish/v1/Chassis/1/Thermal" \
| jq '{Temperatures: [.Temperatures[] | {Name, ReadingCelsius, Status}]}'
done
实际坑:iLO 6 的 Chassis/1/Power 返回的电源数据在双电源配置下,如果其中一个电源线松了,Status.State 会显示 Absent 而不是 Enabled。我们之前告警规则只检查 Status.Health 为 OK,结果有一台机器第二个电源根本没插线,但 Health 还是 OK,因为第一个电源工作正常。后来加了 PowerSupplies[].Status.State 检查才抓到。
最佳实践速查表
| 场景 | 推荐做法 | 别这么做 |
|---|---|---|
| 认证 | 创建 Session 用 Token | 每次请求都带用户名密码 |
| 批量操作 | 用 Python/Go 并发请求,控制并发数 | 串行一个一个发,慢死 |
| 错误处理 | 检查 HTTP 状态码 + 解析 error 字段 | 只看 200,忽略 4xx/5xx 具体信息 |
| 虚拟光驱 | 用 HTTP 直链 ISO 文件 | 用 iLO Web 上传 ISO(慢,容易断) |
| 固件升级 | 用 UpdateService 的 SimpleUpdate | 手动下载再上传,人肉操作 |
| 日志审计 | 定期 GET /Managers/1/LogServices/IEL/Entries | 从不看日志,出问题抓瞎 |
| 安全 | 配证书,用 HTTPS | 用 HTTP,或者跳过证书验证 |
| Session 管理 | 用完 DELETE,设置合理超时 | 创建了不删,Session 泄露 |
常见问题(FAQ)
Q: iLO 6 REST API 和 Redfish 是什么关系?
A: Redfish 是 DMTF 定义的 RESTful 管理接口标准,iLO 6 实现了 Redfish 标准。所以你可以用 Redfish 的通用客户端(比如 redfishtool)来管理 iLO 6,也可以用 HPE 的 ilorest 命令行工具。本质上是一回事。
Q: 如何用 Python 调用 iLO 6 API?
A: 官方有 python-ilorest-library,但说实话那玩意儿封装得太重,我更喜欢直接用 requests 库。上面挂载 ISO 的代码就是纯 Python 示例。如果你非要用官方库,pip install python-ilorest-library 然后看文档。但我觉得自己写更可控。
Q: iLO RESTful API 的默认端口是什么?
A: HTTPS 默认是 443。iLO 6 也支持通过 SSH 的 REST API(端口 22),但那个是 HPE 私有协议,不是标准 Redfish。建议用 HTTPS。
Q: 如何重置 iLO 管理员密码?
A: 物理上机,开机时按 F8 进 iLO System Configuration Utility,或者用 HPE SPP(Service Pack for ProLiant)启动盘里的 iLO 配置工具。API 层面,如果你还有另一个管理员账号,可以用 PATCH /AccountService/Accounts/admin 改密码。如果所有管理员都锁了,只能物理重置。
总结
iLO 6 的 REST API 不是什么黑科技,它就是标准的 HTTP + JSON。但用好它,能把你从重复劳动里解放出来。我见过最骚的操作是有人用 iLO API 配合 CI/CD 流水线,每次部署新版本自动挂载 ISO、设置 PXE 引导、重装系统,全程无人值守。
别再点 Web 界面了。写个脚本,让机器自己管自己。
社区灵感与参考 (References & Community Insights)
本文探讨的架构演进与技术实现方案,深度提炼自 Hacker News、Reddit 等极客社区的真实工程师讨论、线上事故复盘(Post-mortems)以及一线技术博客的实战经验分享。