Azure DevOps管道执行az aks get-credentials报az login错误咨询
问题根因
AzurePowerShell@5管道任务的内置认证逻辑,仅会自动初始化Azure Az PowerShell 模块的登录上下文,不会自动为独立的Azure CLI命令行工具(即az命令)完成身份校验。- 脚本前半段的
Get-AzVmss、Update-AzVmss属于Az PowerShell模块的命令,可以直接复用任务自动注入的服务连接权限正常执行;后续的az aks get-credentials属于Azure CLI命令,没有有效登录上下文,因此触发Please run 'az login' to setup account报错,该问题和服务连接本身的权限配置无关。
可行解决方案
方案1:脚本内同步Az模块登录上下文给Azure CLI(最简便,无需修改管道任务配置)
在执行所有az前缀的命令前,加一行命令把当前Az模块的登录上下文同步给Azure CLI即可,修改后的脚本参考如下:
$rgName = "fdevcusaks04-rg" $clusterName = "fdevcusaks04" $aksMcRg= "MC_fdevcusaks04-rg_fdevcusaks04_centralus" $id= "xxxxxxxxxxxxxxxxxxxxxxxxxx" $aksNodeVmss = Get-AzVmss -ResourceGroupName "$aksMcRg" Update-AzVmss -ResourceGroupName $aksMcRg -Name $aksNodeVmss.Name -IdentityType UserAssigned -IdentityID $id # 新增下行:同步当前Az登录上下文到Azure CLI az account set --subscription (Get-AzContext).Subscription.Id az aks get-credentials --resource-group $rgName --name $clusterName --overwrite-existing
注意:如果运行代理上安装的Azure CLI版本低于2.30,需要先执行az login --identity再执行上述上下文切换命令;2.30以上版本可直接识别Az模块透传的身份信息。
方案2:拆分Az命令与CLI命令到独立任务(最稳定,无需手写认证逻辑)
- 保留现有
AzurePowerShell@5任务,仅运行Get-AzVmss、Update-AzVmss这类依赖Az模块的逻辑 - 新增
AzureCLI@2任务单独运行az aks get-credentials这类CLI命令,该任务会自动用配置的服务连接完成Azure CLI的登录初始化,无需手动编写登录代码。
对应管道配置参考:
- task: AzurePowerShell@5 displayName: '更新VMSS身份配置' inputs: azureSubscription: $(azureSubscription) scriptType: filePath scriptPath: '$(System.DefaultWorkingDirectory)/Terraform/Terraform-Scripts/update_vmss.ps1' azurePowerShellVersion: latestVersion - task: AzureCLI@2 displayName: '获取AKS集群凭证' inputs: azureSubscription: $(azureSubscription) scriptType: ps scriptLocation: inlineScript inlineScript: | az aks get-credentials --resource-group "fdevcusaks04-rg" --name "fdevcusaks04" --overwrite-existing
方案3:脚本内手动完成Azure CLI服务主体登录(兼容性最强)
如果不想拆分任务、也不想依赖上下文自动同步逻辑,可以直接从当前Az上下文中提取服务连接的认证信息,手动完成Azure CLI登录,在执行az命令前加入如下代码即可:
$currentAzContext = Get-AzContext $tenantId = $currentAzContext.Tenant.Id $subscriptionId = $currentAzContext.Subscription.Id $spId = $currentAzContext.Account.Id $spSecret = $currentAzContext.Account.Credentials.SecretText | ConvertTo-SecureString -AsPlainText -Force $spCredential = New-Object PSCredential($spId, $spSecret) az login --service-principal -u $spId -p $spCredential.GetNetworkCredential().Password --tenant $tenantId az account set --subscription $subscriptionId
该方案不受Azure CLI版本限制,所有运行环境均可正常执行。
内容的提问来源于stack exchange,提问作者Muhammad_Bilal
相关产品推荐
相关产品推荐

