使用 Python 構建開源跨平臺 Azure CLI
背景
Microsoft Azure 是一個雲計算平臺,在全球擁有五十多個資料中心,提供數百種服務。作為一個大型雲服務,客戶擁有最好的工具來部署和管理他們的系統至關重要。
從一開始,我們就為開發人員、管理員和架構師提供了各種工具和庫,以執行各種操作:從在虛擬網路中啟動虛擬機器到部署帶有 PostgreSQL 資料庫的 Web 應用。當然,最受歡迎的工具之一是 Azure“az”命令列介面。為了構建這個開源工具,它包含數千條命令以及第三方擴充套件,我們轉向了 Python。

為什麼選擇 Python
最初,Azure 命令列體驗作為 PowerShell 模組適用於 Windows 使用者,作為基於 Node.js 的 CLI 適用於其他所有人,包括使用 macOS 和 Linux 的使用者。然而,顯著的增長導致了難以解決的工程複雜性。
轉向 Python 使我們能夠生成一個在所有平臺上表現相同的實現。每個命令都是 適用於 Python 的 Azure SDK 中一個或多個函式的包裝器,這確保開發人員可以使用相同功能構建指令碼。一致的命令列約定使我們能夠為所有使用者提供一套說明。
由於 Python 易於在我們的所有平臺上分發,我們可以提供符合正確約定的特定於平臺的軟體包。在 Windows 上,您可以使用包含所有必要元件的常規安裝程式。在 Linux 上,我們為許多發行版在我們的儲存庫中提供軟體包,例如 Ubuntu 使用者可以使用 apt-get;在 macOS 上我們推薦 Homebrew。遵守平臺約定讓我們的使用者相信軟體是值得信賴的,而 Python 提供了提供這種靈活性的能力。
Azure CLI 的功能
得益於 Python 的靈活性和強大的軟體包生態系統,Azure CLI 支援諸如自動補全(在支援它的 shell 中)、持久憑據、JMESPath 結果解析、惰性初始化、無網路單元測試等功能。
其中大部分支援已被抽象到一個名為 Knack 的開源軟體包中,允許我們或其他人將其用於自己的命令列工具。
具體到 Azure CLI,我們啟用了可以使用 pip 安裝的擴充套件,以允許開發更復雜的工具,例如自毀模式,它允許使用簡單的命令列引數在一定時間後自動刪除任何資源。能夠擁有一個擴充套件生態系統使我們的使用者能夠開發符合他們偏好的工作流。
由於 Azure 同時支援多個 API 版本以及本地 Azure Stack 部署,Azure CLI 必須能夠根據所連線的版本調整其命令。得益於 Python 中工具的可組合架構,我們可以根據可用性在執行時輕鬆新增或刪除命令。結果是使用者不會被建議使用無效命令或引數,並且即使在使用舊部署時也可以自由更新命令列工具。
結論
Microsoft Azure 提供數百種服務,每種服務都提供多個相容版本和許多命令。透過一個響應迅速、有用且易於使用的命令列工具來暴露這種複雜性是一個挑戰。
用 Python 開發 Azure CLI 使我們能夠設計一個在所有平臺上看起來和感覺都像原生工具的工具,它在任何地方都執行一致,足以滿足互動式使用的效能,支援強大的可擴充套件性,並幫助我們的客戶無論他們打算實現什麼都能取得成功。
