powershell concurrency numbers limit jobs

Limitar el número de trabajos concurrentes de powershell



concurrency numbers (1)

Considere usar un flujo de trabajo. Tiene un foreach paralelo que debería estrangular inteligentemente el número de ejecuciones simultáneas, por ejemplo:

workflow New-Clone([string[]]$Customer) { InlineScript { Import-Module modules } foreach -parallel($cust in $Customer) { InlineScript { ... $vm = Get-VM $using:cust.MasterVM ... } } }

Esto requiere PowerShell V3 o superior para el soporte del flujo de trabajo.

Sé que esta pregunta ya se ha hecho y he visto un par de soluciones posibles, pero parece que no puedo hacer que ninguna de ellas funcione para mi script. Mi script no es un producto terminado, necesita un poco de limpieza, pero definitivamente funciona en este momento.

La función básica de la secuencia de comandos es que crea instantáneas de máquinas virtuales y luego las clona con fines de copia de seguridad. Todo funciona como se esperaba, pero el problema es que pone mi vcenter de rodillas porque lo inunda con demasiados trabajos a la vez. Quería limitar la cantidad de trabajos que se ejecutan a la vez a quizás 3-4 al mismo tiempo. ¿Alguien puede darme una mano? Gracias de antemano ... Aquí está mi código:

Add-PSSnapin VMware.VimAutomation.Core #Connect to vCenter Connect-VIServer vcenter.mydomain.com #Define variables $vmhost = get-vmhost -name 10.1.1.10 #Export list of VM''s get-vmhost -name $vmhost | get-vm | select Name, BackupDS | Export-Csv -NoTypeInformation test.csv #Edit CSV to populate BackupDS Column (Import-Csv test.csv) | % { $_.BackupDS = ''[NAS1]'' +$_.BackupDS; $_ } | Export-Csv test.csv -NoTypeInformation #Edit CSV file to format required by script (gc test.csv) | foreach-object{$_ -replace ''Name'',''MasterVM''} | set-content test.csv -force #Import Backup CSV $backupinfo = Import-Csv test.csv $scriptblock = { Param($customer) Add-PSSnapin VMware.VimAutomation.Core #Connect to vCenter Connect-VIServer vcenter.mydomain.com #Define variables $vmhost = get-vmhost -name 10.1.1.10 #Set Date format for clone names $date = Get-Date -Format "MMddyyyy" #Set Date format for emails $time = (Get-Date -f "HH:MM") $vm = Get-VM $customer.MasterVM #Send Start Email #C:/scripts/backupstartedemail.ps1 # Create new snapshot for clone $cloneSnap = $vm | New-Snapshot -Name "Clone Snapshot" # Get managed object view $vmView = $vm | Get-View # Get folder managed object reference $cloneFolder = $vmView.parent # Build clone specification $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec $cloneSpec.Snapshot = $vmView.Snapshot.CurrentSnapshot # Make linked disk specification $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec $cloneSpec.Location.Datastore = (Get-Datastore -Name $customer.BackupDS | Get- View).MoRef $cloneSpec.Location.Transform = [Vmware.Vim.VirtualMachineRelocateTransformation]::sparse $cloneName = "$vm-$date" # Create clone $vmView.CloneVM( $cloneFolder, $cloneName, $cloneSpec ) # Write newly created VM to stdout as confirmation Get-VM $cloneName # Remove Snapshot created for clone Get-Snapshot -VM (Get-VM -Name $customer.MasterVM) -Name $cloneSnap | Remove- Snapshot -confirm:$False # Remove clones machine from inventory remove-vm -vm $cloneName -confirm:$false #Send Complete Email #C:/scripts/backupcompletedemail.ps1 } $backupinfo | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_ | Out-Null} Get-Job | Wait-Job | Receive-Job

Intenté arrojar el siguiente código al final del guión sin suerte:

$backupinfo | % {Start-Job -Scriptblock $scriptblock -ArgumentList $_ | Out-Null} While((Get-Job -State ''Running'').Count -ge 3) { Start-Sleep -Milliseconds 10 }

Actualizar**

Traté de usar la respuesta que aquí se proporciona, ejecutar trabajos paralelos en PowerShell .

Add-PSSnapin VMware.VimAutomation.Core #Connect to vCenter Connect-VIServer vcenter.mydomain.com #Define variables $vmhost = get-vmhost -name 10.1.1.10 #Export list of VM''s get-vmhost -name $vmhost | get-vm | select Name, BackupDS | Export-Csv -NoTypeInformation test.csv #Edit CSV to populate BackupDS Column (Import-Csv test.csv) | % { $_.BackupDS = ''[NAS1]'' +$_.BackupDS; $_ } | Export-Csv test.csv -NoTypeInformation #Edit CSV file to format required by script (gc test.csv) | foreach-object{$_ -replace ''Name'',''MasterVM''} | set-content test.csv -force #Import Backup CSV $backupinfo = Import-Csv test.csv #Set Date format for clone names $date = Get-Date -Format "MMddyyyy" #Set Date format for emails $time = (Get-Date -f "HH:MM") foreach ($customer in $backupinfo) { $running = @(Get-Job | Where-Object { $_.State -eq ''Running'' }) if ($running.Count -le 8) { Start-Job { $vm = Get-VM $customer.MasterVM #Send Start Email #C:/scripts/backupstartedemail.ps1 # Create new snapshot for clone $cloneSnap = $vm | New-Snapshot -Name "Clone Snapshot" # Get managed object view $vmView = $vm | Get-View # Get folder managed object reference $cloneFolder = $vmView.parent # Build clone specification $cloneSpec = new-object Vmware.Vim.VirtualMachineCloneSpec $cloneSpec.Snapshot = $vmView.Snapshot.CurrentSnapshot # Make linked disk specification $cloneSpec.Location = new-object Vmware.Vim.VirtualMachineRelocateSpec $cloneSpec.Location.Datastore = (Get-Datastore -Name $customer.BackupDS | Get- View).MoRef $cloneSpec.Location.Transform = [Vmware.Vim.VirtualMachineRelocateTransformation]::sparse $cloneName = "$vm-$date" # Create clone #$vmView.CloneVM( $cloneFolder, $cloneName, $cloneSpec ) # Write newly created VM to stdout as confirmation #Get-VM $cloneName # Remove Snapshot created for clone Get-Snapshot -VM (Get-VM -Name $customer.MasterVM) -Name $cloneSnap | Remove-Snapshot - confirm:$False # Remove clones machine from inventory #remove-vm -vm $cloneName -confirm:$false #Send Complete Email #C:/scripts/backupcompletedemail.ps1 } } else { $running | Wait-Job } Get-Job | Receive-Job }

Cuando ejecuto mi script, todo lo que hace es devolver esto para cada máquina virtual, y nunca realiza ninguna de las tareas (instantáneas, etc.)

HasMoreData : True StatusMessage : Location : localhost Command : $vm = Get-VM $customer.MasterVM .................. rest of my code .................. JobStateInfo : Running Finished : System.Threading.ManualResetEvent InstanceId : 81ac8e67-0267-4d11-998b-0e8cfa95292b Id : 40 Name : Job40 ChildJobs : {Job41} PSBeginTime : 2/27/2014 12:41:19 PM PSEndTime : PSJobTypeName : BackgroundJob Output : {} Error : {} Progress : {} Verbose : {} Debug : {}

¿Alguna orientación que pueda proporcionar?