【问题标题】:Azure credentials have not been set up or have expired, please run Connect-AzAccountAzure 凭据尚未设置或已过期,请运行 Connect-AzAccount
【发布时间】:2019-07-23 08:39:13
【问题描述】:

与以下问题有关 (Azure DevOps - Custom Task - PowerShell with Azure Authentification) 我现在使用 Connect-AzAccount 通过 Azure DevOps 自定义任务登录。

在下一步中,我想并行运行多个作业以首先操作然后通过模板部署某些 Azure 资源。使用 AzureRM 这工作没有问题,但切换到 Az 后我总是得到错误

您的 Azure 凭据尚未设置或已过期,请 运行 Connect-AzAccount 以设置您的 Azure 凭据。

我已经将 Az 模块更新到最新版本。

这是我的做法:

验证

try {
    $endpoint = Get-VstsEndpoint -Name $serviceName -Require
    if (!$endpoint) {
        throw "Endpoint not found..."
    }
    $subscriptionId = $endpoint.Data.SubscriptionId
    $tenantId = $endpoint.Auth.Parameters.TenantId
    $servicePrincipalId = $endpoint.Auth.Parameters.servicePrincipalId
    $servicePrincipalKey = $endpoint.Auth.Parameters.servicePrincipalKey

    $spnKey = ConvertTo-SecureString $servicePrincipalKey -AsPlainText -Force
    $credentials = New-Object System.Management.Automation.PSCredential($servicePrincipalId,$spnKey)

    Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credentials
    Select-AzSubscription -SubscriptionId $subscriptionId -Tenant $tenantId

    $ctx = Get-AzContext
    Write-Host "Connected to subscription '$($ctx.Subscription)' and tenant '$($ctx.Tenant)'..."
} catch {
    Write-Host "Authentication failed: $($_.Exception.Message)..." 
}

并行部署

foreach ($armTemplateFile in $armTemplateFiles) {
    $logic = {
        Param(
            [object] 
            [Parameter(Mandatory=$true)]
            $ctx,

            [object] 
            [Parameter(Mandatory=$true)]
            $armTemplateFile,

            [string] 
            [Parameter(Mandatory=$true)]
            $resourceGroupName
        )

        ####################################################################
        # Functions
        function Format-ValidationOutput {
            param ($ValidationOutput, [int] $Depth = 0)
            Set-StrictMode -Off
            return @($ValidationOutput | Where-Object { $_ -ne $null } | ForEach-Object { @('  ' * $Depth + ': ' + $_.Message) + @(Format-ValidationOutput @($_.Details) ($Depth + 1)) })
        }

        ####################################################################
        # Logic

        # Some template manipulation


        $paramFileContent | ConvertTo-Json -Depth 100 | Set-Content -Path $paramTemplateFile.FullName
        $templateFileContent | ConvertTo-Json -Depth 100 | Set-Content -Path $armTemplateFile.FullName

        ####################################################################
        # Test Deployment
        $ErrorMessages = Format-ValidationOutput (Test-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName `
                                                                                        -TemplateFile $armTemplateFile.FullName `
                                                                                        -TemplateParameterFile $paramTemplateFile.FullName `
                                                                                        -DefaultProfile $ctx)
        if ($ErrorMessages) {
            Write-Host '', 'Validation returned the following errors:', @($ErrorMessages), '', 'Template is invalid.'
        }
        else { # Deploy

            New-AzResourceGroupDeployment -Name (($armTemplateFile.Name).Split(".")[0] + ((Get-Date).ToUniversalTime()).ToString('MMddHHmm')) `
                                                -ResourceGroupName $resourceGroupName `
                                                -TemplateFile $armTemplateFile.FullName `
                                                -TemplateParameterFile $paramTemplateFile.FullName `
                                                -Force `
                                                -ErrorVariable ErrorMessages `
                                                -DefaultProfile $ctx
            if ($ErrorMessages) {
                Write-Host '', 'Template deployment returned the following errors:', @(@($ErrorMessages) | ForEach-Object { $_.Exception.Message.TrimEnd("`r`n") })
            }
        }
    }
    Start-Job $logic -ArgumentList (Get-AzContext), $armTemplateFile, $ResourceGroupName
}

While (Get-Job -State "Running")
{
    Start-Sleep 10
    Write-Host "Jobs still running..."
}

Get-Job | Receive-Job

【问题讨论】:

    标签: azure powershell authentication azure-devops azure-authentication


    【解决方案1】:

    由于某种原因(我不知道),将上下文传递给后台作业不再起作用,因为移至 Az 模块(也使用最新版本 (1.4.0))。我尝试使用Save-AzContextImport-AzContext 或通过Get-AzContext 获取上下文并将其传递给后台作业(使用Set-AzContext 或直接使用-DefaultProfile(这种方法适用于AzureRm 模块))。

    现在对我有用的解决方法是单独验证每个后台作业。

    对于工作定义:

    foreach ($armTemplateFile in $armTemplateFiles) {
        $logic = {
            Param(
                [object] 
                [Parameter(Mandatory=$true)]
                $endpointInput,
    
                [object] 
                [Parameter(Mandatory=$true)]
                $armTemplateFile,
    
                [string] 
                [Parameter(Mandatory=$true)]
                $resourceGroupName
            )
    
            ###########################
            #Login
            Write-Host "Authenticating..."
            try {
                $endpoint = $endpointInput
                if (!$endpoint) {
                    throw "Endpoint not found..."
                }
                $subscriptionId = $endpoint.Data.SubscriptionId
                $tenantId = $endpoint.Auth.Parameters.TenantId
                $servicePrincipalId = $endpoint.Auth.Parameters.servicePrincipalId
                $servicePrincipalKey = $endpoint.Auth.Parameters.servicePrincipalKey
    
                $spnKey = ConvertTo-SecureString $servicePrincipalKey -AsPlainText -Force
                $credentials = New-Object System.Management.Automation.PSCredential($servicePrincipalId,$spnKey)
    
                Connect-AzAccount -ServicePrincipal -TenantId $tenantId -Credential $credentials
                Select-AzSubscription -SubscriptionId $subscriptionId -Tenant $tenantId
    
                $ctx = Get-AzContext
                Write-Host "Connected to subscription '$($ctx.Subscription)' and tenant '$($ctx.Tenant)'..."
            } catch {
                Write-Host "Authentication failed: $($_.Exception.Message)..." 
            }
    

    开始工作:

    Start-Job $logic -Name $jobName -ArgumentList $endpoint, $armTemplateFile, $ResourceGroupName
    

    【讨论】:

      【解决方案2】:

      我个人使用这个命令:

      Connect-AzureRmAccount
      

      我首先直接使用 ISE 控制台登录,然后会话保持不变,我可以毫无问题地运行任何脚本(无需在脚本中使用此命令)。

      希望对你有帮助。

      编辑。

      我看到你也在选择订阅,这是我使用的。

      Select-AzureRmSubscription -Subscription 'Subscription ID'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        • 1970-01-01
        • 2020-02-15
        • 2019-07-20
        • 1970-01-01
        • 1970-01-01
        • 2018-06-03
        相关资源
        最近更新 更多