Windows

即使需要重新啟動/重新啟動,如何強制 DSC 執行所有配置(包)

  • April 17, 2014

來自MSDN

RebootNodeIfNeeded:目標節點上的某些配置更改可能需要重新啟動它才能應用更改。如果值為“true”,則此屬性將立即重新啟動節點,並且不會發出警告。如果為“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"
}

引用自:https://serverfault.com/questions/582730