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位,包含大小写字母、数字和特殊字符),且连续失败登录会触发账户锁定。在自动化脚本中,应把凭据存放在加密的配置管理库中,而不是硬编码在脚本里。
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调用仍然重要,因为排障时往往需要直接查看原始请求和响应。
verify=False仅适用于实验环境。生产环境应将iLO证书替换为企业CA签发的证书,并在脚本中启用证书校验,防止中间人攻击。同时,服务账户密码应定期轮换,避免长期不变。