【问题标题】:Creating workflow for parallel scheduled server reboots with logging使用日志记录为并行计划的服务器重启创建工作流
【发布时间】:2016-02-29 01:26:07
【问题描述】:

我目前正在使用以下代码来安排服务器重启。这对于少数服务器来说效果很好,但是当有很多服务器(超过 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

我的研究指出使用workflowforeach -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

【问题讨论】:

    标签: powershell parallel.foreach powershell-workflow


    【解决方案1】:

    创建有序哈希表:

    $hash = [ordered]@{
        'Server'            =  $using:server
        'Status'            = ...
        "LastRebootTime"    = ...
        'CurrentRebootTime' = ...
    }
    

    【讨论】:

    • 看起来不错,谢谢。有什么方法可以让foreach -parallel 运行得更快吗?处理方面有所改进,但与 RunSpacePools 相比仍然慢得多。
    • 我不这么认为,但我对工作流的经验很少。
    • 这意味着 RunSpacePools 获胜。我会沿着这条路走,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-05
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    相关资源
    最近更新 更多