在Azure Powershell任务中使用Azure CLI

6

我想创建一个PowerShell脚本,执行一些AzureRm...命令,然后跟随一些Az命令。原因是某些命令只能通过Az使用。

尝试在发布管道中执行这些脚本时,脚本始终会失败,并显示以下错误:

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

Azure CLI 任务中执行 Az 命令可以正常工作,因为任务会执行 Az Login

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

是否可以在不手动传递密码的情况下,在 Azure Powershell 任务中使用 Az 命令?

最小示例:

  • 创建新的发布管道
  • 添加任务 Azure PowerShell
  • 使用内联脚本
  • 作为脚本,执行 az account show

哪些命令? - 4c74356b41
我的情况需要使用az cosmosdb list-keys和其他的cosmos命令,但是az account show也无法工作。 - Alex AIT
1
尝试使用https://www.powershellgallery.com/packages/CosmosDB/2.1.9.95? - 4c74356b41
我会看一下,谢谢! - Alex AIT
4个回答

2

我想到了这种方法——将凭据存储在作业范围变量中(目前只有Azure CLI任务允许),然后在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

这正是我所需要的,谢谢!现在我可以在我的外部PS文件中运行Azure CLI命令了。 - agw2021

2

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

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

有一些命令没有等效的commandlet。但如果它们可以通过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

2
顺便提一下,可以在az命令中传递--debug参数,以查找它在幕后调用的确切API方法。然后,使用Invoke-AzResourceAction进行复现。 - Monsignor

1
当我有混合命令时,我将其放入我的Azure Powershell任务中。
az login --service-principal --username "$(ServicePrincipal)" --password "$(AzureDevOps-ServicePrincipal-Secret)" --tenant "$(Azure_Tenant)"
我将我的SP和Tenant ID作为变量,并将SP的Secret存储在连接到库变量组的Azure KeyVault中。您也可以将密钥存储在普通变量/变量组中,并单击挂锁图标以进行保护。
如果SP可以访问同一租户中的多个订阅,则可能需要运行 az account set -s $(SubscriptionName)。

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

添加了一个内联的Azure CLI步骤,使用az account show命令,在powershell任务中尝试做同样的事情...但是没有成功。 - Alex AIT

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