Azure Учетная запись автоматизации - Ошибка Runbook - Ссылка на объект не установлена ​​на экземпляр объекта - PullRequest
0 голосов
/ 18 февраля 2020

На прошлой неделе я развернул скрипт для резервного копирования некоторых дисков с помощью командлета New-AzSnapshot. Я запланировал этот сценарий в учетной записи автоматизации Azure, и в течение первых двух дней этот сценарий работал очень хорошо!

Сегодня я проанализировал журналы и обнаружил, что в сценарии была ошибка ниже:

Connect-AzAccount: ссылка на объект не установлена ​​для экземпляра объекта. В строке: 12 символов: 25 + $ connectionResult = Connect-AzAccount `+ ~~~~~~~~~~~~~~~~~~~ + CategoryInfo: CloseError: (:) [Connect-AzAccount], NullReferenceException + FullyQualifiedErrorId: Microsoft. Azure .Commands.Profile.ConnectAzureRmAccountCommand

Кто-нибудь знает, что может быть причиной этой ошибки?

Ниже сценария:

Param(
    [string]$resourceGroupName
)

$connection = Get-AutomationConnection -Name AzureRunAsConnection
while (!($connectionResult) -And ($logonAttempt -le 10)) {
    $LogonAttempt++
    # Logging in to Azure...
    $connectionResult = Connect-AzAccount `
        -ServicePrincipal `
        -Tenant $connection.TenantID `
        -ApplicationID $connection.ApplicationID `
        -CertificateThumbprint $connection.CertificateThumbprint

    Start-Sleep -Seconds 30
}

# Remove old snapshots
$snapshotnames = (Get-AzSnapshot -ResourceGroupName $resourceGroupName).name
foreach($snapname in $snapshotnames)
{
    Get-AzSnapshot -ResourceGroupName $resourceGroupName -SnapshotName $snapname | ?{($_.TimeCreated) -lt ([datetime]::UtcNow.AddMinutes(-10080))} | Remove-AzSnapshot -Force
} 

foreach ($VMs in Get-AzVM -ResourceGroupName $resourceGroupName) {  
    #Set local variables 
    $location = $VMs.Location 
    #$resourceGroupName = $vmInfo.ResourceGroupName 
    $timestamp = Get-Date -f MM-dd-yyyy_HH_mm_ss 

    #Snapshot name of OS data disk 
    $snapshotName = "bkp-" + $VMs.Name + "-" + $timestamp 

    #Create snapshot configuration 
    $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.OsDisk.ManagedDisk.Id -Location $location  -CreateOption copy 

    #Take snapshot 
    New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  



    if ($VMs.StorageProfile.DataDisks.Count -ge 1) { 
        #Condition with more than one data disks 
        for ($i = 0; $i -le $VMs.StorageProfile.DataDisks.Count - 1; $i++) { 

            #Snapshot name of OS data disk 
            $snapshotName = "bkp-" + $VMs.StorageProfile.DataDisks[$i].Name + "-" + $timestamp

            #Create snapshot configuration 
            $snapshot = New-AzSnapshotConfig -SourceUri $VMs.StorageProfile.DataDisks[$i].ManagedDisk.Id -Location $location  -CreateOption copy 

            #Take snapshot 
            New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $resourceGroupName  

        } 
    } 
    else { 
        Write-Host $VMs.Name + " doesn't have any additional data disk." 
    } 
}

1 Ответ

0 голосов
/ 18 февраля 2020

У вас возникла исключительная ситуация nullreference, вы просматриваете расположение внутри сообщения об ошибке (в строке: 12 символов: 25). он показывает, что connection равен нулю.

Вам необходимо сначала объявить connection на той же странице, прежде чем вы сможете использовать переменные внутри.

См. также: Что такое NullReferenceException и как его исправить?

РЕДАКТИРОВАТЬ: При втором уведомлении я думаю , что вы уже объявили $connection в

$connection = Get-AutomationConnection -Name AzureRunAsConnection

но похоже, что возвращается ноль. В этом случае вам нужно выяснить, почему возвращается null, потому что он должен возвращать заполненный $connection, если он подключен.

Для безопасной проверки во избежание ошибок: сначала нужно проверить, не является ли $connection ненулевым, перед вводом while (например, $connection != null может работать для Javascript). Таким образом, вы не получите ошибок, но имейте в виду, что вы не получите результат через это.

...