在 Azure Powershell 任务中使用 Azure CLI

Use Azure CLI within Azure Powershell Task

我想创建一个 Powershell 脚本,它执行一些 AzureRm... 命令并在这些命令之后执行一些 Az 命令。原因是某些命令只能通过 Az.

使用

尝试在发布管道中执行这些脚本时,脚本总是失败并出现以下错误:

ERROR: Please run 'az login' to setup account.

Azure CLI 任务中执行 Az 命令按预期工作,因为 Az Login 由任务执行。

如果可能的话,我不想传递登录脚本所需的密码。我宁愿退回到将脚本分成管道中的两个步骤。

是否可以在 Azure Powershell 任务中使用 Az 命令而无需手动传递机密?

最小示例:

无论如何,它不会那样工作,因为您必须单独对 az 实用程序进行身份验证。 az cli 和 powershell 不共享连接信息。您可以尝试在 powershell 步骤之前使用 az step 和一些命令。这将强制 az 进行身份验证,然后您可以在 powershell ste.

中使用它

当我有混合命令时,我将其放入我的 Azure Powershell 任务中

az login --service-principal --username "$(ServicePrincipal)" --password "$(AzureDevOps-ServicePrincipal-Secret)" --tenant "$(Azure_Tenant)"

我将我的 SP 和租户 ID 作为变量,存储在 Azure KeyVault 中的 SP 的秘密链接到一个库变量组。您也可以将秘密存储在普通的 Variable/Variable 组中,然后点击挂锁图标来保护它。

如果 SP 可以访问同一租户中的多个订阅,您可能需要 运行 az account set -s $(SubscriptionName)

我已经采用的短期解决方案是将 ServicePrincipal 信息传递到 powershell 脚本并手动执行 az login(与下面 Bevan 的回答相同)。

我的长期解决方案是用 "Az Powershell" 命令替换所有 Azure CLI 调用。 幸运的是,现在大多数命令都可用。

一些命令没有等效的命令行开关。但是,如果它们可通过 ARM 使用,您可以使用 Powershell 找出替代命令。

其中许多涉及使用 New-AzResource/New-AzureRmResourceInvoke-AzResourceAction/Invoke-AzureRmResourceAction

# AzureCLI
az cosmosdb list-keys
# Powershell:
$keys = Invoke-AzResourceAction -Action listKeys `
    -ResourceType "Microsoft.DocumentDb/databaseAccounts" -ApiVersion "2015-04-08" `
    -ResourceGroupName $resourceGroupName -Name $accountName

我想到了这种方法 - 将凭据存储在作业范围的变量中(目前只有 Azure CLI 任务允许这样做)然后 re-use 在 Azure PowerShell任务:

  - task: AzureCLI@2
    displayName: 'Azure CLI - get credentials'
    inputs:
      azureSubscription: 'SUBSCRIPTIONNAME'
      scriptType: 'pscore'
      scriptLocation: 'inlineScript'
      addSpnToEnvironment: true
      inlineScript: |
        Write-Host "##vso[task.setvariable variable=ARM_CLIENT_ID]$($env:servicePrincipalId)"
        Write-Host "##vso[task.setvariable variable=ARM_CLIENT_SECRET]$($env:servicePrincipalKey)"
        Write-Host "##vso[task.setvariable variable=ARM_TENANT_ID]$($env:tenantId)"      

  - task: AzurePowerShell@5
    displayName: 'collector'
    inputs:
      azurePowerShellVersion: LatestVersion
      azureSubscription: 'SUBSCRIPTIONNAME'
      pwsh: true
      scriptType: inlineScript
      inline: |
        az login --service-principal --username "$($env:ARM_CLIENT_ID)" --password "$($env:ARM_CLIENT_SECRET)" --tenant "$($env:ARM_TENANT_ID)"
        ./mixedscript.ps1