2019年2月10日 星期日

[經驗分享]更強大的 Proxmox VE 命令列管理工具 - pvesh



眾所皆知,Proxmox VE 提供了相當良好的 WebUI 給我們使用,但有時候我們仍然需要在命令列下操作叢集或虛擬機器,因此 pvecm、qm 等指令會是進階 PVE 使用者掌握的重要工具。

不過,事情亦沒有如此美好。以 qm 指令來看,有個致命的缺點,也就是「必須連接到該節點才能以 qm 操作該節點上的虛擬機器」,這對擁有許多節點的管理者相當不便。

舉個例子,我以 ssh 登入 Node A 的命令列,無法使用 qm 指令啟動位在 Node B 上面的虛擬機器,偶爾遇到還好,但緊急或大量操作的時候,這就是一個影響效率的重要關鍵。

那麼,我們有什麼解決方案呢?






替代方案

其實 Proxmox VE 做為一個全 Web 化管理的平台,早就已經擁有功能全面且符合 REST API 規範的一系列介面供其它程式呼叫使用。

Proxmox VE API Documentation


為了解決這個問題,當然是捲起袖子自幹一支管理工具。

在大部份的應用場景,自己重新開發顯然不合成本。

可以使用 curl 這個 Linux 上必備的神器等級工具,透過 curl 來呼叫 PVE API 路徑,即可跨叢集以 CLI 命令列管理 PVE 各節點上的虛擬機器與容器。

我們直接以官網的範例來說明:第一步要先送出帳密取得 Ticket,再以此 Ticket 做為呼叫 API 的 Token,還要記住這個 Ticket 的有效期間只有兩個小時,超過時間需要重新取得 Ticket。

登入 API 取得 Ticket
# curl -k -d "username=root@pam&password=yourpassword" https://10.0.0.1:8006/api2/json/access/ticket  
輸出結果:
{ "data": { 
  "CSRFPreventionToken":"4EEC61E2:lwk7od06fa1+DcPUwBTXCcndyAY",  
  "ticket":"PVE:root@pam:4EEC61E2::rsKoApxDTLYPn6H3NNT6iP2mv...", 
  "username":"root@pam"}
}
帶入 Ticket 呼叫 API 功能
curl -k -b "PVEAuthCookie=PVE:root@pam:4EEC61E2::rsKoApxDTLYPn6H3NNT6iP2mv..." https://10.0.0.1:8006/api2/json/
寫入需求 (POST, PUT, DELETE) 的 API 呼叫方法
curl -XDELETE -H "CSRFPreventionToken: 4EEC61E2:lwk7od06fa1+DcPUwBTXCcndyAY" ...


呼叫的 API 路徑,可以參考 PVE 官方所提供的 API 文件,它是一個良好的 API Viewer,可以很容易的找到需要呼叫功能的路徑以及用法、參數。

等等,用 curl 呼叫 API 雖然可以跨叢集,可是用起來反而更麻煩呀,我不如回去用 qm........







更好方案

別擔心,Proxmox VE 開發團隊意識到了這點,所以他們也另外開發了一支 CLI 工具協助我們解決這個問題。

pvesh


pvesh 就是 PVE 團隊提供的利器,一次幫我們搞定許多複雜的事,同時也會把 API 回傳的 JSON 格式結果,以較適合人類的表格方式顯示。

舉幾個比較常用的指令,做為 pvesh 的用法展示。

顯示目前連接節點的 pve-manager 版本
pvesh get /version
顯示叢集資源的狀況
pvesh get /cluster/resources

pvesh 取得版本與叢集資源



繼續來展示其它的用法,以節點的資訊操作為主:

顯示叢集中的節點
pvesh get /nodes

顯示節點中的虛擬機器
pvesh get /nodes/<nodeid>/qemu

pvesh 取得節點清單與虛擬機器清單



上面的展示指令都只是資訊讀取,接下來可以看看怎麼對 PVE 進行操作。

顯示虛擬機器狀態
pvesh get /nodes/<nodeid>/qemu/<vmid>/status/current

將虛擬機器開機
pvesh create /nodes/<nodeid>/qemu/<vmid>/status/start

pvesh 取得虛擬機器狀態與開機


可以注意到,開機這個動作所採用的命令是 create 而不是 get,請特別留意。

成功開機後,命令列會顯示開機這個作業的作業 ID (Task ID) 以及使用者帳號等相關資訊,供我們判斷 ,同時這個作業資訊跟 WebUI 是完全一致的。

WebUI 作業視窗顯示 pvesh 執行的作業資訊


若是虛擬機器開機失敗,也會在命令列執行結果完整顯示:

pvesh 虛擬機器開機失敗輸出結果



更多其它的操作方式範例:

顯示容器快照
pvesh get /nodes/<nodeid>/lxc/<ctid>/snapshot

pvesh 顯示容器快照資訊




顯示節點的 ZFS 儲存區
pvesh get /nodes/<nodeid>/disks/zfs

顯示節點的磁碟列表
pvesh get /nodes/<nodeid>/disks/list

pvesh 顯示節點 ZFS 儲存與節點磁碟列表






結論

有了 pvesh,過去我們所經常使用的 pvecm、qm、pct、pvesm 等 CLI 工具都已經可以被 pvesh 所取代,在 WebUI 上所有能做的事幾乎都被 pvesh 所實現,對於喜愛使用指令操作系統的管理員而言,簡直是必備工具,正所謂「pvesh 在手,pve 天下我有」。






參考資料