运维笔记

HPE iLO 6 REST API 实战教程:从 Redfish 入门到自动化运维

Infrastructure 技术可视化

别再用 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,然后自动化干点正事。

前置条件:别上来就翻车

先确认三件事,少一个都白扯:

  1. iLO 固件版本:必须 iLO 6 2.00 或更高。老版本 API 路径不一样,接口也少。你可以在 iLO Web 界面右上角看到固件版本。
  2. 许可证:iLO Standard 许可证够用,但有些高级功能(比如远程控制台、电源监控)需要 iLO Advanced 或更高。查看许可证状态:GET /redfish/v1/Managers/1/LicenseService
  3. 网络可达:你的管理机器和 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/1iLO 自身管理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.HealthOK,结果有一台机器第二个电源根本没插线,但 Health 还是 OK,因为第一个电源工作正常。后来加了 PowerSupplies[].Status.State 检查才抓到。

最佳实践速查表

场景推荐做法别这么做
认证创建 Session 用 Token每次请求都带用户名密码
批量操作用 Python/Go 并发请求,控制并发数串行一个一个发,慢死
错误处理检查 HTTP 状态码 + 解析 error 字段只看 200,忽略 4xx/5xx 具体信息
虚拟光驱用 HTTP 直链 ISO 文件用 iLO Web 上传 ISO(慢,容易断)
固件升级UpdateServiceSimpleUpdate手动下载再上传,人肉操作
日志审计定期 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)以及一线技术博客的实战经验分享。

Elvin Hui

关于作者:Elvin Hui

Elvin 拥有 10+ 年企业级数据中心、云原生架构和网络安全经验。持有 CCNA、AWS 解决方案架构师认证。我致力于将一线的“踩坑”经验沉淀为真实、硬核的技术指南,拒绝空洞理论。