BMC 筆記:Redfish
這篇承接了 BMC、IPMI 兩篇,如果對這兩個東西不熟,可以先複習一下在來看這篇。
Redfish 簡介
不免俗地先放 logo。
Redfish 是由 DMTF (Distributed Management Task Force) 在 2015 年正式提出的開放標準,
目標是取代 IPMI,提供「現代化、可擴充、安全」的伺服器管理協定。
其設計與 IPMI 相當不同,將傳輸上的 binary 改為 HTTP/HTTPS + JSON + RESTful API,以此為基礎進行設計,因此任何支援 HTTP 的工具 (ex: Python、curl、Postman、瀏覽器) 都能直接與 BMC 溝通。
Redfish 架構
目前我對 redfish 的對外關係理解如上,基本上 Redfish 跑在 BMC 上,用來接收來自 Client 的 RESTful API,再由 BMC 透過 I2C、SMBus 等方式控制硬體。
前面提過 redfish 走的是 HTTP/HTTPS,所以這邊回傳的 status code 是用 HTTP Status Code。
Redfish Resource Model 
基本上 redfish service root 會在 /redfish/v1/,直接 GET 此 URI 不需要權限驗證,會將 redfish 底下的 service 直接展示出來。
這邊只提主要的 model:
Chassis:描述實體機體(物理外殼)與其內含的硬體元件
Managers:控制與監控中樞,會監控 Chassis、控制 Systems
Systems:實際執行應用程式的系統
Authentication
redfish 的身分驗證有二:
第一個是 HTTP Basic authentication,內容點連結,這邊不細說。另一個則是 Session。
在 redfish 建立 session 的 URI 是 /redfish/v1/SessionService/Sessions,官方給的範例如下:
curl -k -D - -X POST 'https://<REDFISH-HOST>/redfish/v1/SessionService/Sessions' \
-H "Content-Type: application/json" -d '{ "UserName": "<USERNAME>", "Password": "<PASSWORD>" }'
Session 建立好後會回傳 SESSION-TOKEN 回來,之後只要在發送 request 時將 X-Auth-Token: <SESSION-TOKEN> 帶上,就不用每次執行指令都要做身分驗證了。
Session 用完後我們可以 DELETE 這個 Session,官方給的刪除範例如下:
curl -k -X DELETE 'https://<REDFISH-HOST>/redfish/v1/SessionService/Sessions/<SESSION-ID>' \ -H 'X-Auth-Token: <SESSION-TOKEN>
Query parameters
這是當我們開始實際使用 redfish 時,一定要理解的一個核心機制,它讓使用者可以控制伺服器傳回多少資料、以什麼形式呈現、以及篩選哪些欄位。對於會使用 SQL 、設計過查詢功能 RESTful API 的工程師來說,應該很容易上手。
舉個例子,用途是「取得特定廠牌的系統」:
GET /redfish/v1/Systems?$filter=Manufacturer eq 'HPE'
GET:使用的 HTTP 方法
/redfish/v1/Systems:URI
?:用於區隔 URI 與參數
$filter=:參數名稱
Manufacturer eq 'HPE':參數內容,指「Manufacturer 為 HPE」
常用的參數如下:
| 參數名稱 | 功能 | 範例 | 說明 |
|---|---|---|---|
| $filter | 篩選符合條件的成員 | $filter=Status/State eq 'Enabled' | 像 SQL 的 WHERE |
| $select | 指定只回傳哪些欄位 | $select=Id,Name,PowerState | 可以減少 loading |
| $expand | 展開關聯物件 | $expand=ComputerSystem | 取得關聯子資源的資料 |
| $top | 限制回傳的項目數量 | $top=5 | 像 SQL 的 LIMIT |
| $skip | 跳過前 N 筆資料 | $skip=10 | |
| $orderby | 排序結果 | $orderby=Name desc | 像 SQL 的 ORDER BY |
| $format | 指定輸出格式 | $format=application/json | 少見,通常伺服器自動處理 |
| $count | 要求伺服器附上資料總筆數 | $count=true | 用於分頁 UI 的資料量顯示 |
其中比較特別的是 $expand,功能有點像 SQL 中的 JOIN。
另外是一些使用時的注意事項:
並非所有 BMC 都支援全部 Query Parameters,像 $expand 常不支援。
區分大小寫
URI 編碼如果有空白或特殊字元要用 %20 編碼,例如: $filter=Status/Health eq 'OK' → $filter=Status/Health%20eq%20'OK'
回傳內容皆為 JSON
Resource
Redfish Resource and Schema Guide
留言
張貼留言