web-dev-qa-db-ja.com

再起動/再起動が必要な場合でも、DSCにすべての構成(パッケージ)を強制的に実行させる方法

から [〜#〜] msdn [〜#〜]

RebootNodeIfNeeded:ターゲットノードの特定の構成変更では、変更を適用するために再起動が必要になる場合があります。値が「true」の場合、このプロパティは警告なしにノードをすぐに再起動します。 「false」の場合、構成は完了しますが、変更を有効にするにはノードを手動で再起動する必要があります。

したがって、私の理解では、再起動が必要な場合でも、DSCはすべての構成を実行する必要があります

しかし、私の場合はそうではありません。Packageをインストールした後、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
    }
6
Jupaol

私はこの解決策を思いついた

しかし、もっと良い方法を見つけたいと思います。しかしとにかくそれは私のために働く

私の場合、このプロセスは継続的インテグレーションプロセスの一部として開始されるため、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"
}
1
Jupaol

各リソースは、LCMにサーバーの再起動を要求できます。リソースが再起動を要求すると、再起動をスケジュールし、サーバーの再起動後に整合性チェックを実行するようにLCMをスケジュールします(これにより、構成を続行できます)。

再起動が必要であることを(イベントログまたはStart-DscConfigurationの詳細ストリームを介して)通知する場合は、RebootIfNeededを$ falseに設定する必要があります。次に、再起動する必要があります。一部のインストーラーは、マシンの再起動が必要な場合に実行されないため、これは、システムを手動で再起動するのを待っているブロッカーである可能性があります。

0
Steven Murawski