Azure CLI vs Powershell?

84

无法准确理解Azure CLI在Windows环境中的优点。

它是为想要从Linux环境管理Azure IAAS的用户而设计的吗?

我认为Powershell core将成为非Windows管理员的途径。 PowerShell Core不会在所有平台上良好地移植,以服务于跨平台受众吗?

简而言之,学习Azure CLI是否值得?


2
基本上是的,它针对的是Linux用户。PowerShell Core在Linux上可用,并且已经移植了一些模块并正在工作中,显然随着时间的推移,所有模块都将被移植到核心,因为完整的.NET版本的PowerShell不会出现。 - 4c74356b41
这里有一个关于Azure相关命令行工具的很好的总结链接,也包括在下面的答案链接中。 - minus one
12个回答

54

Azure CLI是一种类似于PowerShell的工具,适用于所有平台。无论您使用哪个平台(Windows、Linux或Mac),都可以使用相同的命令。

目前,有两个版本的Azure CLI。Azure CLI 1.0使用Node.js编写以实现跨平台功能,而新的Azure CLI 2.0使用Python编写以提供更好的跨平台功能。两者均为开源且可在Github上获取。但是,目前只有某些PowerShell cmdlet支持在Linux上使用。

它是面向想要从Linux环境管理Azure IAAS的受众吗?

我认为答案是肯定的。对于Linux或Mac开发人员来说,他们更有可能使用Azure CLI。


2
请注意,现在有一个Azure PowerShell模块可供安装到PowerShell Core中,这是一个跨平台版本的PowerShell,可在Windows、Linux或macOS上运行。 - Mark Z.
我相信在Azure Powershell命令中有一些CLI中不存在的命令,但是我目前无法具体想到。我在MPB上同时使用Powershell Core和CLI,但我更喜欢CLI,因为它使得Powershell脚本看起来更加清晰。在我看来。 - Karl Merecido

43

Azure CLI和PowerShell包都使用Azure的REST API。

正如我们的一位微软联系人所说:使用你喜欢和偏好的任何工具。

Azure CLI的一些优点包括:

  1. 开源-具有很多优势。未来它可能会更快地发展。您可以查看代码中真正的内容,社区可能会更大,等等。
  2. Azure CLI可与Groovy、Python、Ruby或任何其他脚本语言一起使用。相对于经验丰富的PowerShell开发人员,更容易找到这些语言的好开发人员。例如:我选择Groovy是因为它基于Java。使用这种组合比学习PowerShell脚本更容易...

目前PowerShell有一个非常大的优势:在Azure上有一个巨大的PowerShell脚本示例库。但是:通常你必须自己去适应你的需求-因此示例可能是一个很好的起点-有时从头开始更容易。

我的建议是:使用Azure CLI->对于脚本编写,请使用公司熟悉的语言。


4
Azure PowerShell 也是开源的 :) - Jared Moore
3
哈哈,“随便哪个我喜欢”的!我没头绪!我只想要一个! - Simon_Weaver
6
PowerShell最大的好处是它基于对象操作,而不是字符串。因此,处理命令输出变得非常容易:$t = Get-AzEventGridTopic ... ; $endpoint = $t.Endpoint。如果使用Azure CLI,则需要解析字符串才能实现相同的效果。 - Monsignor
@Monsignor:那其实不是这样的……这取决于你使用的脚本语言。每种语言都有其优点和缺点。由于您还可以获得JSON响应:大多数语言为您提供了对JSON的对象访问。因此,PowerShell的优点也适用于Azure CLI。 - TheShadow
@Monsignor 那个好处可以用 $t = (az {your options} | ConvertFrom-Json) 来实现。这更像是支持 bash VS. pwsh 的一个论点。 - minus one
显示剩余2条评论

30

我想分享一下我使用 Azure Cli 和 Az PowerShell 的经验。

截至2019年,两者都是跨平台的,因此应该只是语言/语法偏好问题,但使用 Azure Cli 可以实现所有/大多数命令具有幂等性。

我最终用 Azure Cli 脚本替换了所有 ARM 模板,因为它不啰嗦且易于阅读。

对于 Az Powershell,您仍需要在创建资源之前检查其是否存在,否则会抛出异常,因此脚本可能会变得非常复杂而毫无意义。

我们在 Azure DevOps 中同时使用 Azure Cli 和 Az Powershell。Azure Cli 命令现在可以从 bash(Linux)或 bat(Windows)脚本中执行。所以这并不是最优...(编辑2020现在你也可以使用 Powershell 脚本运行 Azure CLI)

  • 我们使用 Azure Cli 部署资源,因为它易于阅读,而且命令��有幂等性。
  • 对于复杂的脚本编写,我更喜欢使用 PowerShell,因为它有很多有用的语言特性。

编辑2021

通过新的Azure Bicep,我开始重新使用“ARM 类型”的部署:如果您理解 ARM 模板并保持可读性,Bicep 非常容易使用,即使在复杂的部署中也很清晰。

除了 Az CLI(Powershell core),它可以处理我需要执行的大多数脚本。


11
我了解您在自己的环境中可以自由做任何想做的事情。然而,重要的是要说,“用CLI脚本替换ARM模板”并不是最佳实践。 - Jerry Nixon
2
Azure CLI 命令也可以在 Powershell 脚本中使用。 - user2368632
@JerryNixon-MSFT,你说得对。我觉得基于你的工程师技能,最好让他们选择。ARM是声明式的,并且拥有所有最新的功能。例如,在部署API管理时,我们使用了ARM,因为它更容易操作。 - Thomas
1
@JerryNixon-MSFT,您能否详细说明或指出一篇关于为什么CLI不是“最佳实践”的文章/博客帖子? - nithins
我使用CLI创建了一些PowerShell,但当我想在DevOps管道中运行时,我发现这个组合不是自动可用的。这两个选项非常令人困惑。是否已经修复此问题,允许您在DevOps管道中选择任何组合? - Morrolan
显示剩余2条评论

14

PowerShell 相对于 CLI 具有一些显著的优势:

  • PowerShell 是 Azure Functions 的支持语言,因此您可以轻松地编写模块或代码并将其推送到安全的 Azure Function。但是 CLI 不支持。
  • 同样适用于 Azure Automation Runbooks,然而 CLI 不支持。
  • 如果要编排跨本地和云的混合工作负载,例如在 Windows Server 上部署服务,然后在 Azure 中部署端点进行交互,PowerShell 可以做到,但 CLI 不能(我会感到惊讶如果它能够做到)。
  • 如果要投资于一个语言来调用管理遗留模块,PowerShell 可以做到,但 CLI 不能。
  • 如果要创建自己的 C# 或其他语言的 DLL 并将其纳入脚本中。我不得不反向工程 DLL 并将其包装在 PowerShell 中以纳入编排中。
  • 与 CLI 相比,我使用 PowerShell 在扩展 DevOps 管道方面取得了更大的成功。
  • PowerShell 非常好地支持多线程工作负载,例如 Azure 单元测试和烟雾测试以及大规模的 Azure 并行部署(超出 DevOps 并行任务的使用范围)。TBH,我不知道 Azure CLI 是否具有本机多线程。
  • 我可以开发一个模块,在所有以上的场景中使用它,然后将其提供给最终客户;说实话,我不相信我能够在CLI上做到这一点(创建一个模块,数字签名然后分发到NuGet feed)。
  • 在 PowerShell 中几乎没有我不能编写脚本的内容,而在 CLI 中我可以做一些事情,但不能做其他事情。我的 PowerShell 技能已经保持了10多年的相关性,我一直在进行企业级 SharePoint、Dynamics、现在是 Office 和 Azure 的工作... 所以我有偏见。


    我们可以轻松地从PowerShell中使用Azure CLI。在我看来,这并不是选择Azure CLI工具与Azure PowerShell模块的因素。你说得对,bash不是Azure Functions支持的语言。我还要强调一下,PowerShell是一个非常强大的跨平台脚本语言,具有对象级别的管道处理能力。 - minus one

    5

    2018年之前,非Windows平台上没有Powershell。自2018年1月开始,Powershell可在MacOS和Linux平台上使用。

    安装Powershell的说明适用于MacOS或Linux,可以在此处找到。


    5

    PowerShell也是开源的。微软刚刚发布了PowerShell Azure Az模块(2018年12月),它使用了.Net core。因此,它可以在Linux、Mac OS和Windows上运行。如果喜欢,Linux开发人员仍然可以使用Azure CLI。


    3

    由于这是社区中经常被问到的问题,最近文档中添加了一篇文章,涵盖了各种Azure命令行选项之间的相似性、差异性和细微差别:选择正确的Azure命令行工具。这篇文章应该能回答你大部分的问题。

    在管理Azure方面,你有很多选择。虽然Azure CLIAzure PowerShellAzure Cloud Shell具有重叠的功能,但每个工具的操作方式不同,并且有时语言也会与环境混淆。

    Azure CLI vs Azure PowerShell: Azure CLI和Azure PowerShell都是命令行工具,可让您创建和管理Azure资源。虽然两者都是跨平台的,可在Windows、macOS和Linux上安装,但Azure CLI在Windows PowerShell、Cmd或Bash和其他Unix shell中运行,而Azure PowerShell需要Windows PowerShell或PowerShell。

    不同的Shell环境: Windows PowerShell、PowerShell、Cmd和Bash都是shell环境。您的shell环境不仅决定了可以使用哪些工具,还会改变您的命令行体验。

    Shell Environment | Azure CLI | Azure PowerShell |
    ------------------|-----------|------------------|
    Cmd               | Yes       |                  |
    Bash              | Yes       |                  |
    Windows PowerShell| Yes       | Yes              |
    PowerShell        | Yes       | Yes              |
    

    使用Azure命令行工具并不总是必要的,但拥有这种技能是很有用的。在选择命令行工具时,请记住以下几个关键因素:

    • 在选择合适的工具时,请考虑您过去的经验和当前的工作环境。
    • Azure CLI语法类似于Bash脚本。如果您主要使用Linux系统,则Azure CLI更加自然。
    • Azure PowerShell是一个PowerShell模块。如果您主要使用Windows系统,则Azure PowerShell是一个自然的选择。命令遵循动词-名词命名方案,并且数据以对象形式返回。
    • 请记住,Azure CLI和Azure PowerShell之间并不总是存在Azure服务的功能对等性。
    • 选择使用您熟悉的工具并缩短学习曲线。在有意义的情况下,使用不同的工具。

    3
    简而言之,学习Azure CLI值得吗?
    我注意到在进行微软Azure培训(AZ-900基础和AZ-303 Azure架构师)时,练习都是在Azure CLI中完成的。尽管它们都是“复制并粘贴此代码”,但似乎微软更喜欢CLI而不是PowerShell,至少是用于培训目的。
    更新:最近我在代理后使用Azure CLI遇到了很多麻烦。PowerShell没有任何问题。作为一个习惯于PowerShell的人来说,CLI有点笨拙且不智能。尽管如此,Terraform需要Azure CLI,这可能足以考虑学习它。

    1

    不一定要在Linux上使用Azure CLI,你也可以在Windows上使用,而且效果非常好=D

    我的个人意见是,这取决于你想做什么。我更喜欢使用Azure CLI命令而不是Azure CMDLETS。但是我仍然将PowerShell作为我的脚本编程语言。

    CLI中的某些模块比AZ或AzRM cmdlet更加"直接"。


    0

    我曾经使用过 Az Powershell 和 cli,但当文档含糊不清或命令不受支持时,我强烈建议跳过这两个工具,直接使用Azure Rest API

    Azure Rest API通常由其他命令行工具调用,因此它最具备功能完整性和一般性的文档。它也是跨平台的。

    最困难的部分是弄清楚身份验证。从powershell开始,我通常使用类似于这样的格式,但如果需要,可以转换为curl+cli或放置在Web应用程序中。这里是一个随机示例:

    $azContext = Get-AzContext
    $subscriptionId = $azContext.Subscription.Id
    $azProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
    $profileClient = New-Object -TypeName Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient -ArgumentList ($azProfile)
    $token = $profileClient.AcquireAccessToken($azContext.Subscription.TenantId)
    $authHeader = @{
        'Content-Type'='application/json'
        'Authorization'='Bearer ' + $token.AccessToken
    }     
      
    $uri = "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$rg/providers/Microsoft.Web/sites/$site/config/web?api-version=2022-03-01"
    $Body = @{      
        "properties" = @{netFrameworkVersion = "v6.0"}
    }
    $Params = @{
        Uri = $uri
        Headers = $authHeader
        Method = "PUT"
        Body = $Body | ConvertTo-Json -Depth 10
    }
    $response = Invoke-RestMethod @Params
    $response.properties.netFrameworkVersion
    

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