Назад | Перейти на главную страницу

Как заставить DSC выполнять все конфигурации (пакеты), даже если требуется перезагрузка / перезагрузка

Из MSDN

RebootNodeIfNeeded: Некоторые изменения конфигурации на целевом узле могут потребовать его перезапуска, чтобы изменения вступили в силу. При значении «истина» это свойство перезапустит узел немедленно и без предупреждения. Если «false», настройка будет завершена, но узел необходимо перезапустить вручную, чтобы изменения вступили в силу.

Насколько я понимаю, DSC должен запустить все конфигурации даже если требуется перезагрузка

Но в моем случае это не так, после установки Пакет иногда DSC помечается как перезагрузка, и DSC не запускает остальные конфигурации

Мне нужно вручную выполнить команду снова, чтобы запустить остальные конфигурации

Start-DscConfiguration -Wait -Force -Path .\SomePath

Я хотел бы заставить DSC запустить все конфигурации, а затем сообщить мне, нужно ли мне перезапустить сервер

Примеры того, как я настраиваю пакеты

    LocalConfigurationManager
    {
        RebootNodeIfNeeded = $false
    }

   Package MVC3
    {
        Name = "Microsoft ASP.NET MVC 3"
        Ensure = "Present"
        Path = "$Env:SystemDrive\AspNetMVC3ToolsUpdateSetup.exe"
        ProductId = "DCDEC776-BADD-48B9-8F9A-DFF513C3D7FA"
        Arguments = "/q"
        DependsOn = "[WindowsFeature]IIS"
        Credential = $Credential
    }

   Package MVC4
    {
        Name = "Microsoft ASP.NET MVC 4 Runtime"
        Ensure = "Present"
        Path = "$Env:SystemDrive\AspNetMVC4Setup.exe"
        ProductId = "942CC691-5B98-42A3-8BC5-A246BA69D983"
        Arguments = "/q"
        DependsOn = "[Package]MVC3"
        Credential = $Credential
    }

Я придумал это решение

Хотя я бы хотел найти лучший способ сделать это. Но в любом случае это работает для меня

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

[int]$maximumAttempts = 5
[int]$attempt = 0
[ValidateNotNull()][guid]$dscResTmp = [guid]::NewGuid()
[ValidateNotNullOrEmpty()][string]$dscResPathTmp = Join-Path $baseFolderPathTmp "$dscResTmp.log"

do
{
    [bool]$stopLoop = $false
    [int]$attempt = ++$attempt

    Start-DscConfiguration -Wait -Force -Path $folderPathTmp 4> $dscResPathTmp

    [string[]]$rebootServerCoincidences = Select-String -Pattern "reboot" -Path $dscResPathTmp

    if ($rebootServerCoincidences.Length -le 0)
    {
        [bool]$stopLoop = $true
    }
    else
    {
        Write-Warning ($rebootServerCoincidences -join [Environment]::NewLine)
    }
}
while($stopLoop -eq $false -and $attempt -le $maximumAttempts)

if ($stopLoop -eq $false)
{
    Write-Warning "Max attempts reached"
}

Каждый ресурс может запросить у LCM перезагрузку сервера. Если ресурс запрашивает перезагрузку, он планирует перезагрузку и планирует, чтобы LCM запускал проверку согласованности после перезагрузки сервера (чтобы он мог продолжить настройку).

Если вы хотите, чтобы он уведомлял вас (через журнал событий или подробный поток Start-DscConfiguration) о необходимости перезагрузки, вам необходимо установить RebootIfNeeded в $ false. Тогда вы отвечаете за перезагрузки. Некоторые установщики не будут запускаться, если требуется перезагрузка машины, поэтому это может быть блокировщиком, ожидающим, когда вы вручную перезагрузите систему.