3. iLO管理接口与Redfish API入门

在HPE ProLiant服务器上,iLO(Integrated Lights-Out)是独立于主机操作系统的带外管理控制器。它拥有自己的处理器、内存、网络接口和固件,只要服务器接入电源且管理网口连通,即使主机处于关机、蓝屏或系统未安装状态,运维人员依然可以通过iLO完成开关机、查看硬件健康、挂载虚拟介质、读取日志等操作。而Redfish则是DMTF制定的现代带外管理标准,它用RESTful风格和JSON数据模型统一了不同厂商的管理接口。iLO从第4代开始原生支持Redfish,这意味着我们可以用Python脚本对成百上千台ProLiant进行批量、可编程的管理,而不必逐台登录Web界面。

iLO网络配置:让管理口先“上线”

iLO要能被访问,第一步是给它一个可达的IP地址。iLO的网络配置有三种典型途径:服务器开机时在POST阶段按F9进入iLO配置界面、通过iLO Web界面修改、或者用HPE的iLOrest/Redfish在已有网络的情况下远程修改。对于批量部署,最常用的是在初始阶段通过DHCP自动获取地址,再统一改为静态IP。

假设我们规划的管理网段是192.168.50.0/24,网关为192.168.50.1,每台服务器的iLO依次分配192.168.50.101、.102……。在iLO Web界面中,路径为“iLO Dedicated Network Port → Network → IPv4”,将DHCP关闭,填入静态地址、子网掩码和网关。若使用Redfish远程配置,则通过PATCH请求修改/redfish/v1/Managers/1/EthernetInterfaces/1资源。需要注意:修改iLO IP会导致当前连接中断,因此远程操作时应确保新地址可达,并预留带外访问通道(如串口或现场操作)作为回退手段。

iLO的默认主机名通常形如ILOXXXXXXXXXXXX,其中后12位是服务器序列号。建议在批量配置时同步设置有意义的主机名和DNS域名,便于后续通过名称而非IP进行管理。此外,iLO还支持共享端口模式(Shared Network Port),即复用主机板载网卡,但生产环境更推荐使用独立的iLO专用网口,以保证带外管理通道与业务网络隔离。

用户管理:权限分级与账户安全

iLO内置用户账户体系,每个账户可分配不同的权限级别。常见权限包括:Administrator(完全控制,可修改用户和网络配置)、Operator(可开关机、挂载介质,但不能改用户)、Read Only(仅查看)、No Access(禁用)。批量运维中,通常为自动化平台创建一个专用的服务账户,例如svc_redfish,赋予Administrator权限,并设置强密码;同时禁用或删除默认的Administrator账户,避免默认凭据被利用。

通过Redfish创建用户的典型流程是:先向/redfish/v1/AccountService/Accounts发送POST请求,请求体中包含UserName、Password、RoleId等字段。iLO会返回新账户的@odata.id,后续可通过PATCH修改密码或权限。需要特别注意的是,iLO对密码复杂度有要求(通常至少8位,包含大小写字母、数字和特殊字符),且连续失败登录会触发账户锁定。在自动化脚本中,应把凭据存放在加密的配置管理库中,而不是硬编码在脚本里。

iLO Redfish 调用链路与资源模型 Python 客户端 requests / urllib3 Basic Auth 或 Session JSON 请求体 HTTPS 443 GET/POST/PATCH iLO 管理控制器 Redfish Service /redfish/v1/ 账户 / 网络 / 电源 固件 / 日志 / 传感器 内部映射 Redfish 资源树 Systems/1 Managers/1 Chassis/1 AccountService UpdateService ① 配置 iLO IP PATCH EthernetInterfaces/1 IPv4StaticAddresses Gateway / SubnetMask HostName / DomainName ② 创建管理用户 POST AccountService/Accounts UserName: svc_redfish RoleId: Administrator Password: 强密码策略 ③ 读取硬件状态 GET Systems/1 GET Chassis/1/Thermal GET Chassis/1/Power 解析 JSON 健康状态 统一入口:https://<iLO_IP>/redfish/v1/ → 所有操作均通过标准 HTTP 方法与 JSON 数据完成 认证方式:Basic Auth(简单)或 Session(推荐,避免每次请求重复传凭据)

Redfish协议基础:资源、方法与状态码

Redfish的核心思想是“一切皆资源”。每个资源都有一个唯一的URI,例如/redfish/v1/Systems/1代表服务器系统,/redfish/v1/Chassis/1/Thermal代表散热信息。资源之间通过@odata.id链接,形成一棵可导航的资源树。访问根节点/redfish/v1/会返回一个包含Systems、Chassis、Managers、AccountService、UpdateService等子资源的JSON对象。

HTTP方法在Redfish中有明确语义:GET读取资源,POST创建资源或执行动作(如重启、创建用户),PATCH修改资源属性(如改IP、改密码),DELETE删除资源(如删除用户)。响应状态码遵循HTTP标准:200 OK表示成功,201 Created表示资源已创建,202 Accepted表示异步任务已接受,400 Bad Request表示请求体格式错误,401 Unauthorized表示认证失败,404 Not Found表示资源不存在。在自动化脚本中,必须对状态码进行判断,而不是假设每次请求都成功。

Redfish还支持异步操作。例如重启服务器时,iLO可能返回202和一个Location头,指向一个任务资源(Task)。脚本需要轮询该任务直到状态变为Completed或Exception,才能确认操作真正完成。这是批量运维中容易忽略但非常关键的一点。

Python调用示例:从单台到批量

下面用Python的requests库演示一个最小可用的Redfish调用流程。示例中iLO地址为192.168.50.101,用户名为svc_redfish,密码为示例值P@ssw0rd_ILO(实际使用时应从安全存储读取)。

import requests
import json

ILO_IP = "192.168.50.101"
BASE = f"https://{ILO_IP}/redfish/v1"
AUTH = ("svc_redfish", "P@ssw0rd_ILO")

# 关闭证书告警(实验环境;生产应导入iLO证书)
requests.packages.urllib3.disable_warnings()

# 1. 读取系统资源,确认服务器型号与电源状态
r = requests.get(f"{BASE}/Systems/1", auth=AUTH, verify=False, timeout=10)
print("状态码:", r.status_code)
sys_data = r.json()
print("型号:", sys_data.get("Model"))
print("电源:", sys_data.get("PowerState"))
print("健康:", sys_data.get("Status", {}).get("Health"))

# 2. 读取散热传感器,检查风扇与温度
r = requests.get(f"{BASE}/Chassis/1/Thermal", auth=AUTH, verify=False, timeout=10)
thermal = r.json()
for fan in thermal.get("Fans", []):
    print(fan.get("Name"), fan.get("Reading"), fan.get("Status", {}).get("Health"))

# 3. 创建管理用户(若已存在会返回400,需先判断)
payload = {
    "UserName": "svc_redfish",
    "Password": "P@ssw0rd_ILO",
    "RoleId": "Administrator",
    "Enabled": True
}
r = requests.post(f"{BASE}/AccountService/Accounts",
                  auth=AUTH, verify=False, timeout=10,
                  json=payload)
print("创建用户状态码:", r.status_code)
if r.status_code == 201:
    print("新账户URI:", r.headers.get("Location"))

运行上述脚本,若iLO可达且凭据正确,会依次输出服务器型号、电源状态、健康状态、各风扇转速与健康,最后尝试创建用户。若创建用户返回400,通常是因为用户名已存在或密码不符合复杂度要求;若返回401,则说明认证失败,应检查用户名密码或账户是否被锁定。

批量场景下,可以把上述逻辑封装成函数,遍历一个IP列表或从CMDB读取服务器清单。更高效的做法是使用HPE官方提供的python-ilorest-library,它封装了会话管理、任务轮询和资源导航,减少重复代码。但理解底层HTTP调用仍然重要,因为排障时往往需要直接查看原始请求和响应。

实践建议:在批量修改iLO IP或创建用户前,先用一台测试服务器验证脚本逻辑;对生产环境,建议先GET读取当前配置并保存为JSON备份,再执行PATCH或POST。所有写操作都应记录操作人、时间、目标iLO地址和变更内容,便于审计和回滚。
安全提醒:iLO的Redfish接口默认使用自签名证书,脚本中verify=False仅适用于实验环境。生产环境应将iLO证书替换为企业CA签发的证书,并在脚本中启用证书校验,防止中间人攻击。同时,服务账户密码应定期轮换,避免长期不变。