在 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
命令而无需手动传递机密?
最小示例:
- 创建新的发布管道
- 添加任务
Azure PowerShell
- 使用内联脚本
- 作为脚本,执行
az account show
无论如何,它不会那样工作,因为您必须单独对 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-AzureRmResource
或 Invoke-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
我想创建一个 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
无论如何,它不会那样工作,因为您必须单独对 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-AzureRmResource
或 Invoke-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