使用 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 使我们能够构建一个在所有平台上看起来和感觉都像原生的工具,可以在任何地方一致运行,性能足以进行交互式使用,支持强大的可扩展性,并帮助我们的客户无论他们打算实现什么都取得成功。