Как получить отзыв о выполнении DSC на виртуальной машине Azure?

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

Я могу нормально настроить DSC с помощью PowerShell, но, поскольку этот процесс автоматизирован, я хотел получить обратную связь о том, как продвигался процесс настройки. Когда я звоню Update-AzureVM, я получаю одобрение, но конфигурация DSC происходит после этого, асинхронно, и я не знаю, как это происходит, пока я не войду в машину (или взгляните на обновленный портал Azure, который теперь показывает это).

Я бы хотел, чтобы мой автоматизированный процесс завершился сбоем, если конфигурация не удалась. Как я могу проверить статус конфигурации из моего сценария и изящно определить успех или неудачу?


person julealgon    schedule 29.10.2014    source источник
comment
Я думаю, что Get-xDscOperation может быть тем, что вы ищете? technet.microsoft.com/en-us/library/dn249926.aspx он в основном использует журналы событий для проверки статуса   -  person Paul    schedule 29.10.2014
comment
@Paul Очень интересно .. Я полагаю, мне нужно будет запускать эти команды на виртуальной машине удаленно, верно? Я надеялся на что-то более автоматизированное с помощью Azure SDK.   -  person julealgon    schedule 29.10.2014
comment
Вы также должны иметь возможность вызывать его локально, но в основном да. Не уверен, что в Azure SDK есть специальные командлеты для этого, но я в этом сомневаюсь.   -  person Paul    schedule 29.10.2014


Ответы (3)



Есть несколько способов сделать это. Вы можете вызвать API на основе REST, как я описал в недавнем сообщении здесь.

Вы также можете использовать Get-AzureVM для детализации значения (точно так же, как при анализе ответа REST) ​​следующим образом:

((Get-AzureVM -ServiceName "" -Name "").ResourceExtensionStatusList | Where-Object { $_.HandlerName -eq 'Microsoft.PowerShell.DSC' }).ExtensionSettingStatus.Status

person David Coulter    schedule 31.10.2014
comment
Очень хороший. При этом я предполагаю, что могу создать цикл в своем скрипте, читая это поле и сообщая его значение вызывающему абоненту. Задокументированы ли где-нибудь возможные значения? Мне нужно, по крайней мере, знать конечные состояния, чтобы я мог остановить сценарий и сообщить о результатах. - person julealgon; 02.11.2014

Основываясь на предложении @David, я создал функцию опроса, чтобы обнаруживать изменения статуса и сообщать об этом моему основному сценарию.

Во-первых, мне нужно было найти, где находятся коды состояния завершения (мне нужно завершить цикл, как только я обнаружу успешную операцию DSC или произойдет какая-либо ошибка).

Я углубился в файлы, используемые расширением DSC в виртуальной машине, чтобы найти возможные коды состояния и основывал на этом свое состояние. Коды состояния можно найти в C:\Packages\Plugins\Microsoft.Powershell.DSC\1.4.0.0\bin\DscExtensionStatus.psm1 на любой виртуальной машине с установленным расширением DSC. Вот коды состояния версии 1.4.0.0 расширения DSC:

$DSC_Status = @{
    Initializing = @{
        Code = 1
        Message = "Initializing DSC extension."
    }
    Completed = @{
        Code = 2
        Message = "DSC configuration was applied successfully." 
    }
    Enabled = @{
        Code = 3
        Message = "PowerShell DSC has been enabled." 
    }
    RebootingInstall = @{
        Code = 4
        Message = "Rebooting VM to complete installation."
    }
    RebootingDsc = @{
        Code = 5
        Message = "Rebooting VM to apply DSC configuration." 
    }
    Applying = @{
        Code = 6
        Message = "Applying DSC configuration to VM."
    }

    #
    # Errors
    #
    GenericError = 100; # The message for this error is provided by the specific exception

    InstallError = @{
        Code = 101
        Message = "The DSC Extension was not installed correctly, please check the logs on the VM."
    }
    WtrInstallError  = @{
        Code = 102
        Message = "WTR was not installed correctly, please check the logs on the VM."
    }
}

Логика в функции несколько запутана, потому что изменения состояния являются постоянными, т.е. они происходят не от одной операции DSC, а от всего расширения. Из-за этого мне нужно было сначала выбрать статус, а затем попытаться найти обновления. Я использую поле timestamp для определения нового статуса. Вот код:

function Wait-AzureDSCExtensionJob
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory)]
        [string] $ServiceName,

        [int] $RefreshIntervalSeconds = 15
    )

    Begin 
    {
        $statusFormat = `
            @{Label = 'Timestamp'; Expression = {$_.TimestampUtc}},
            @{Label = 'Status'; Expression = {"$($_.Code) - $($_.Status)"}}, `
            @{Label = 'Message'; Expression = {$_.FormattedMessage.Message}}

        Write-Verbose 'Getting starting point status...'
        $previousStatus = Get-AzureDscStatus -ServiceName:$ServiceName
        Write-Verbose "Status obtained: $($previousStatus | Format-List $statusFormat | Out-String)"
        Write-Verbose 'This status will be used as the starting point for discovering new updates.'
    }
    Process
    {
        do
        {
            Write-Verbose "Waiting for the next check cycle. $RefreshIntervalSeconds seconds left..."
            Start-Sleep -Seconds:$RefreshIntervalSeconds

            $currentStatus = Get-AzureDscStatus -ServiceName:$ServiceName
            if ($previousStatus.TimestampUtc -eq $currentStatus.TimestampUtc)
            {
                Write-Verbose 'Status has not changed since the last check.'
                $statusUpdated = $false
            }
            else
            {
                Write-Verbose "Status updated: $($currentStatus | Format-List $statusFormat | Out-String)"
                $previousStatus = $currentStatus
                $statusUpdated = $true
            }

            # Script with default message codes for the DSC Extension:
            # On Target VM: "C:\Packages\Plugins\Microsoft.Powershell.DSC\1.4.0.0\bin\DscExtensionStatus.psm1"
        } until ($statusUpdated -and (($currentStatus.Code -eq 2) -or ($currentStatus.Code -ge 100)))
    }
    End 
    {
        switch ($currentStatus.Code)
        {
            2 {Write-Verbose 'Configuration finished successfully.'; break}
            default {throw "Configuration failed: $($currentStatus.Status)"}
        }
    }
}

function Get-AzureDscStatus
{
    [CmdletBinding()]
    Param(
        [Parameter(Mandatory)]
        [string] $ServiceName
    )

    Begin
    {
        $vm = Get-AzureVM -ServiceName:$ServiceName
        $dscExtensionStatus = $vm.ResourceExtensionStatusList | where { $_.HandlerName -eq 'Microsoft.PowerShell.DSC' }
        if (-not $dscExtensionStatus) 
        {
            throw 'Could not find the PowerShell DSC Extension on the VM'
        }

        $dscExtensionStatus.ExtensionSettingStatus
    }
}

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

ОБНОВЛЕНИЕ 28 ноября 2014 г.:

Microsoft обновила расширение DSC до версии 1.5.0.0, и моя функция сломалась, как мило с их стороны. Я имею в виду ... это не значит, что изменение кодов ответов является критическим изменением или что-то в этом роде;)

Вот новые коды состояния:

$DSC_Status = @{
    Success = @{
        Code = 1
        Message = 'DSC configuration was applied successfully.' 
    }
    Initializing = @{
        Code = 2
        Message = 'Initializing DSC extension.'
    }
    Enabled = @{
        Code = 3
        Message = 'PowerShell DSC has been enabled.' 
    }
    RebootingInstall = @{
        Code = 4
        Message = 'Rebooting VM to complete installation.'
    }
    RebootingDsc = @{
        Code = 5
        Message = 'Rebooting VM to apply DSC configuration.' 
    }
    Applying = @{
        Code = 6
        Message = 'Applying DSC configuration to VM.'
    }

    #
    # Errors
    #
    GenericError = 1000 # The message for this error is provided by the specific exception

    InstallError = @{
        Code = 1001
        Message = 'The DSC Extension was not installed correctly, please check the logs on the VM.'
    }
    WtrInstallError = @{
        Code = 1002
        Message = 'WTR was not installed correctly, please check the logs on the VM.'
    }
    OsVersionNotSupported = @{
        Code = 1003
        Message = 'The current OS version is not supported. The DSC Extension requires Windows Server 2012 or 2012 R2, or Windows 8.1.'
    }
}

Коды почему-то поменялись местами и теперь 1 это успех, а ошибки выросли с 100 до 1000 (наверняка на этом ожидают много ошибок).

person julealgon    schedule 05.11.2014