Azure CLI和PowerShell之间的区别

9

我是一个Windows用户,但是我请求您不要限制回答只针对Windows。

我尝试在Power-Shell中执行Azure CLI命令,并且它们成功地执行了,但是反过来就不行。在这种情况下,为什么我们有2个单独的命令集?为什么不只使用Power-Shell?我只尝试了一些基本的命令,它们都是可以工作的,除了filter命令| find只能在CLI中工作,而| Select只能在Power-Shell中工作。

我知道Azure CLI是为了跨平台支持。但是对于Windows用户,是否有任何区别?在Power-Shell上运行CLI命令会有什么后果吗?

提前致谢。


请查看以下链接,看看是否回答了您的问题:https://dev59.com/21cO5IYBdhLWcg3wkif2。 - Gaurav Mantri
这个回答解决了你的问题吗?Azure CLI vs Powershell? - Michael Freidgeim
5个回答

9

以下是我使用两者的观点。并不是说其中一个比另一个更好。它们都有优缺点。


Azure CLI是跨平台的命令行工具,用于管理Azure资源,可在Windows、Mac和Linux上运行。这也意味着它可以在Windows PowerShell上运行。与Azure PowerShell相比,它更加灵活,因为它是一个二进制文件,可以在任何操作系统默认shell中运行,不需要解释,并保留HTML标签。

在PowerShell上运行CLI命令有什么后果吗?

更新可能有点麻烦。如果想在 Windows 上更新,您需要按照 在 Windows 上安装 Azure CLI 的说明重新安装 MSI。在其他平台上更新更容易,这让我只想在 Windows PowerShell 上使用 Azure PowerShell。一种解决方法是在 Windows 上使用 WSL,然后您可以在 Windows 机器内运行 Linux 上的 Azure CLI。您可以在 Windows 10 上的 Windows 子系统安装指南 中安装 WSL。我发现使用 apt-get 在 Linux 上更新 azure-cli 包比在 Windows 上容易得多。您可以查看 使用 apt 安装 Azure CLI 以了解如何在 Linux 上安装 Azure CLI 包。

另一个区别是,你必须使用 Azure CLI 链接多个命令,例如 az group list 与 Azure PowerShell 中的 Get-AzResourceGroup。你也不能像在 Azure PowerShell 中那样运行 Get-Help 命令来获取 Azure CLI 命令的帮助信息,这对我来说是一个巨大的改变,因为我发现 PowerShell 的帮助系统非常有用,可以显示有关 PowerShell Cmdlets 的详细信息。Azure CLI 的帮助信息可以通过 az --help 找到,但不如 Get-Help 全面。
当在 Windows PowerShell 中使用 Azure CLI 时,Tab 键补全也无法使用,这使得输入有些麻烦,这也是我在 Windows 中使用 WSL 的另一个原因。您可以查看此 Autocompletion support in Windows command line GitHub 问题的其他替代方案。
Azure PowerShell是一组用于从命令行管理Azure资源的PowerShell Cmdlets,只能在Windows PowerShell和PowerShell Core中使用。这也意味着,如果运行PowerShell Core的其他操作系统(如Mac或Linux),则它也可以运行Azure PowerShell。
“我只尝试了一些基本命令,它们都可以工作,除了筛选命令| find只能在CLI中使用,而| Select只能在PowerShell中使用。”

Select-Object或其简称Select是PowerShell Cmdlet,因此仅适用于PowerShell对象。find可以搜索字符串或文本文件。此外,如果您正在从Azure CLI搜索数据,则应使用--query参数而不是find,因为find仅限于在文本中搜索字符串。Azure CLI使用JMESPath查询语言来搜索您接收到的JSON输出中的数据。如果您熟悉此查询语言,则使用Azure CLI搜索数据不应该是太大的问题。此外,您还可以在PowerShell脚本中使用Azure CLI命令,但反之则不行。


摘要

如果你需要处理多个平台或者想要与使用不同平台的人编写脚本,使用Azure CLI是一个好选择。然而,如果你主要处理Windows系统并且与其他人一起工作,那么使用Azure PowerShell是一个好主意。如果像我一样需要在不同的平台上使用,那么安装两者都是一个好主意。如果你仍然只想在不同的操作系统平台上使用Azure PowerShell,则需要PowerShell Core。

对于简单的任务,例如在云shell中快速查找资源或编写快速脚本,使用Azure CLI很好,并且比Azure PowerShell更简洁。如果你已经经常使用bash,这会感觉更自然,并且将Azure CLI命令添加到现有脚本将是一个简单的任务。正如其他人所说,没有任何阻止你将Azure CLI命令添加到powershell脚本中,这允许你使用ConvertFrom-Json将JSON输出反序列化为PSCustomObject

对于更复杂的任务,Azure PowerShell更可取,因为使用.NET对象/OOP原则比解析从Azure CLI给出的JSON文本要容易得多。这是我尽可能使用Azure PowerShell的原因之一。

Azure CLI受益于具有幂等性,因此对资源运行相同的命令不需要像Azure PowerShell那样进行任何空值检查。如果这成为问题,则可以在Azure PowerShell中运行ARM模板,这些模板具有幂等性。

更新

正如@AimusSage在评论中提到的那样,最近发布了 PowerShell 7.0,它代替了原来的名称 PowerShell CorePowerShell 6.x。您可以在 Announcing PowerShell 7.0 中阅读更多信息。

另一个想法

如果您想要保持 Azure PowerShell 的面向对象编程原则,但同时又希望使用对于 Linux 系统管理员更容易使用的工具,则可以考虑使用 Azure SDK for Python。我过去就在 Linux 主机上运行脚本时使用过该工具,这样就不必使用 Azure CLI 或安装 PowerShell。


1
补充一下,他们最近发布了 PowerShell 7,放弃了 Core 的名称。请参见此博客文章 - AimusSage

3
我喜欢之前的回答,但我想为企业界提供一个不同的观点,因为他们被迫选择一种方式:
引用:

在这种情况下,为什么我们有两个独立的命令集?为什么不只使用PowerShell呢?

重新表述:Az CLI和Az PowerShell都调用相同的API,即Azure API。这很重要,因为从理论上讲,你最终将能够以两种方式完成所有操作。
那么,为什么微软会创建并维护两种做同样事情的方式呢?
Martin Fowler曾说过:但请记住,团队的技能将超过任何单体/微服务选择。 如果你把单体/微服务改成PowerShell/Bash,那么问题就得到了解答。
我认为有些人已经使用Bash开发系统几十年了,还有其他团队是PowerShell的重度用户。微软不希望他们不得不学习一个全新的编程语言才能使用Azure。
总结:
如果你的团队熟悉PowerShell,请使用PowerShell,并尽可能多地使用本机PowerShell功能。这样你就可以从错误处理、面向对象编程概念、环境设置、并行化等方面受益。
如果你的团队是Linux管理员,是Jenkins的重度用户,已经有数百万行Bash自动化其他工具,并一直使用Bash,那么请使用CLI并保持所有已构建工具的一致性。

1
这是真的,这就是为什么我从来没有指出哪一个更好(因为实际上没有),它们是不同的。 - 4c74356b41
我越使用Azure Devops,就越发现两个平台之间的坚持不同。PWSH模块和AZ CLI可能(最终)调用相同的Azure API,但它们在到达目的地的过程中执行不同的操作。似乎并非所有参数都以相同的方式处理,特别是对于WebApps和ACR容器。我们大多数用于WebApp的PWSH脚本使用az命令,而不是Az PWSH模块的“等效”命令。</抱怨> - Robert Slaney
@RobertSlaney 你说得对,这取决于服务类型。这就是我说“最终”的原因。但是,例如,AKS非常CLI导向(现在和将来),如果你想使用PS操作它,你会发现很多cli命令也是如此。这也是因为本地Kubernetes使用bash(kubectl)-其他Azure服务从PS方面看更好。至少从PS运行Bash比另一种方式要好得多。 - Carlos Garcia

0
我注意到在进行MS Azure培训(AZ-900基础和AZ-303 Azure架构师)时,练习是使用Azure CLI完成的。
这并不意味着它更好,但如果你想参加考试,熟悉它可能是值得的。就我个人而言,我更喜欢PowerShell。

0

现有的答案是愚蠢的看待这个问题的方式,而且会误导人。

最大的区别在于Azure CLI是一个可以在不同平台上运行的二进制文件,而Powershell是一个可以跨平台工作的shell。Azure Powershell是一堆Powershell模块,其他所有内容都源自此。

find无法在CLI中工作,因为没有in the cli,因为它不是一个shell。在Windows上,Powershell中的find可以完美地工作,因为它是Windows操作系统中的二进制文件,而select是Powershell中的一个cmdlet,因此它在Windows的命令行(或Linux上的bash)中无法工作。

此外,如果您正在从Azure CLI搜索数据,则应使用--query参数而不是find

这也是有争议的,JMESPath查询语言过于复杂,没有特定的原因,我不知道Azure Cli实际上与官方JMESPath文档兼容性如何。我更喜欢使用Powershell来运行Azure Cli命令,并使用Powershell解析输出JSON。显然,您可能不像我一样熟悉Powershell,您可能不觉得这很方便。


1
我喜欢两个答案。从技术角度来看,@4c74356b41提到了根本原因:一个是二进制的,另一个不是——这带来了一堆后果,你们两个以不同的方式描述了它们。其中有一部分引发了这个讨论——哪个对于特定任务更好?甚至更糟糕的是:哪个对我更好?所有的答案都对某些情况下的某些人正确(这就是为什么我给两个答案点赞的原因)。 - Carlos Garcia
1
如果您有这样的特殊情况,那么是的。如果涉及Azure,则始终可以调用普通API,ts并不比安装PS / Cli更好,但有时您也会被迫这样做,因为您的企业正在阻止您访问。我的观点是,如果您想找到一个技术上被迫使用其中之一的角落案例,您会找到它。还有另一个方面:“您的团队已经拥有哪些知识?学习这个大新东西是否有意义?还是我最好在其他地方投资?” - Carlos Garcia
好的,现有的答案也没有提到这一点。但是该人声称在使用Azure CLI时没有理由使用PowerShell,这显然是荒谬的(他已经删除了评论)。 - 4c74356b41
当您需要 Azure PowerShell 中独有的功能来完成某个任务,而另一个任务则需要 CLI 中的功能时。 - 4c74356b41
为什么我要费力去搜索那些在一个工具中不可用而在另一个工具中可用的东西呢?我确定PowerShell缺少大部分az aks命令,但我主要使用的是PowerShell,而不是CLI,所以不知道缺少了什么,但显然确实有一些东西缺失。所有Azure工具都缺少一些API调用。可能更容易查看Python SDK以确定与PowerShell相比缺少了什么,因为CLI肯定会缺少它。 - 4c74356b41
显示剩余2条评论

-1
在使用 Azure Powershell 时还有一个问题,那就是不同版本的命令存在差异,而这一点在 Azure CLI 中并不存在。我花费了数天时间来查找管道中哪个脚本需要哪个命令的哪个版本,这真的很让人困扰。这是最荒谬的分配任务之一。

这并没有给出问题的答案。您可以搜索类似的问题,或者参考页面右侧的相关和链接问题来找到答案。如果您有一个相关但不同的问题,请提出一个新的问题,并包含此问题的链接以帮助提供上下文。请参阅:提问,获得答案,没有干扰 - phoenixstudio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接