Создание рабочего процесса для параллельных запланированных перезагрузок сервера с ведением журнала

В настоящее время я использую следующий код для планирования перезагрузки сервера. Это работает очень хорошо для нескольких серверов, но становится проблемой, когда серверов много (более 80), потому что Register-ScheduledJob занимает много времени для каждого сервера.

$user = Get-Credential -UserName $env:USERNAME -Message "UserName/password for scheduled Reboot"
$trigger = New-JobTrigger -once -at $date
$script = [ScriptBlock]::Create("D:\Scripts\Scheduled-Reboot-Single.ps1 -server $server")
Register-ScheduledJob -Name $server -Credential $user -Trigger $trigger -ScriptBlock $script

Мое исследование указывало на использование workflow и foreach -parallel.

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

workflow Do-ScheduledReboot{
  Param([string[]]$servers)

  foreach -parallel($server in $servers) {

    InlineScript {
      try {
        $LastReboot = Get-EventLog -ComputerName $using:server -LogName system |
                      Where-Object {$_.EventID -eq '6005'} |
                      Select -ExpandProperty TimeGenerated |
                      select -first 1

        #New loop with counter, exit script if server did not reboot.
        $max = 20; $i = 0
        do {
          if ($i -gt $max) {
            $hash = @{
              "Server" =  $using:server
              "Status" = "FailedToReboot!"
              "LastRebootTime" = "$LastReboot"
              "CurrentRebootTime" = "FailedToReboot!"
            }
            $newRow = New-Object PsObject -Property $hash
            $rnd = Get-Random -Minimum 5 -Maximum 40
            Start-Sleep -Seconds $rnd
            Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force

            exit
          }#exit script and log failed to reboot.
          $i++

          Start-Sleep -Seconds 15
        } while (Test-path "\\$using:server\c$")
        $max = 20; $i = 0
        do {
          if ($i -gt $max) {
            $hash = @{
              "Server" =  $using:server
              "Status" = "FailedToComeOnline!"
              "LastRebootTime" = "$LastReboot"
              "CurrentRebootTime" = "FailedToReboot!"
            }
            $newRow = New-Object PsObject -Property $hash
            $rnd = Get-Random -Minimum 5 -Maximum 40
            Start-Sleep -Seconds $rnd
            Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force

            exit
          }#exit script and log failed to come online.
          $i++

          Start-Sleep -Seconds 15
        } while (-not(Test-path "\\$using:server\c$"))

        $CurrentReboot = Get-EventLog -ComputerName $using:server -LogName system | Where-Object {$_.EventID -eq '6005'} | Select -ExpandProperty TimeGenerated | select -first 1
        $hash = @{
          "Server" =  $using:server
          "Status" = "RebootSuccessful"
          "LastRebootTime" = $LastReboot
          "CurrentRebootTime" = "$CurrentReboot"
        }

        $newRow = New-Object PsObject -Property $hash
        $rnd = Get-Random -Minimum 5 -Maximum 40
        Start-Sleep -Seconds $rnd
        Export-Csv D:\workflow-results.csv -InputObject $newrow -Append -Force
      } catch {
        $errMsg = $_.Exception
        "Failed with $errMsg"
      }#end catch
    }#end inline script
  }#end foreach parallel
}#end workflow

$mylist = gc D:\Servers.txt
Do-ScheduledReboot -servers $mylist

person user4317867    schedule 29.02.2016    source источник


Ответы (1)


Создайте упорядоченные хеш-таблицы:

$hash = [ordered]@{
    'Server'            =  $using:server
    'Status'            = ...
    "LastRebootTime"    = ...
    'CurrentRebootTime' = ...
}
person Ansgar Wiechers    schedule 29.02.2016
comment
Выглядит хорошо, спасибо. Есть ли способ заставить foreach -parallel работать быстрее? Обработка улучшена, но по-прежнему намного медленнее по сравнению с RunSpacePools. - person user4317867; 05.03.2016
comment
Я так не думаю, но у меня очень мало опыта работы с рабочими процессами. - person Ansgar Wiechers; 05.03.2016
comment
Это означает, что RunSpacePools побеждает. Я пойду по этому пути, спасибо! - person user4317867; 05.03.2016