DevOpsParallel verwerken met PowerShell

PARALLEL VERWERKEN MET POWERSHELL

PowerShell werkt op een traditionele wijze en verwerkt zijn opdrachten 1 voor 1. Wil je bijvoorbeeld weten of er een service op een Windows Server aanwezig is, dan geef je een lijstje met 1 of meerdere servers op en Powershell werkt deze lijst server per server af.  Dit is op zich geen probleem als je de actie wilt uitvoeren op tien servers, maar wat nu als het duizenden servers zijn?

Voorbeeld standaard code:
Voorbeeld standaard code

Het is mogelijk om parallel opdrachten uit te voeren. Dit kan op verschillende manieren:
1. PowerShell Jobs;
2. PowerShell Workflows;
3. PowerShell runspaces;

Bij een van onze klanten hebben we de workflow methode geïmplementeerd, voor het verwijderen van een grote hoeveelheid individuele bestanden in de TFS-database, wat een tijdbesparing van enkele dagen opleverde.

PowerShell Jobs

Jobs zijn opdrachten die op de achtergrond uitgevoerd worden. Er kunnen meerdere jobs op een server worden gestart, dus dit geeft ons de mogelijk om een commando parallel te laten draaien.
Voorbeeld code:

Voorbeeld code:

Met Get-Job, kunnen de running jobs worden opgevraagd
PowerShell Jobs
Zijn de jobs klaar, dan is met het commando Receive-Job -het resultaat op te vragen
Resultaat:

PowerShell Jobs

Om de jobs op te schonen, kan Remove-Job worden gebruikt.
Voorbeeld code:

PowerShell Workflows

Workflows zijn geïntroduceerd in PowerShell 3.0 en zijn onder de juiste omstandigheden zeer krachtig. Zo kunnen ze onder andere gebruikt worden in scripts waarbij de target machine moet herstarten. Ook krijg je de output rechtstreeks, zodat je geen jobs hoeft uit te lezen. Workflows werken alleen in een 64 bit omgeving.

Voorbeeld code:

Voorbeeld code:
Resultaat:
PowerShell Workflows
Workflows heeft wat eigenaardigheden. Zo werkt bijvoorbeeld Write-Host “Hello world!” niet, maar “Hello World!” geeft wel output. Ook is het oplossen van code probleempjes binnen de workflow lastiger, omdat de foutmelding onsamenhangend en onlogisch over kunnen komen.

PowerShell Runspaces

De laatste optie is runspaces. Deze manier van parallel uitvoeren gaat meer richting de programmeer kant dan de script kant. Er wordt gebruikt gemaakt van het .Net Framework. Mocht je hier niet in thuis zijn, dan is het handiger om 1 van de eerder genoemde opties te gebruiken.
In dit voorbeeld maken we 5 powershell runspaces aan, halen we de gewenste Windows Service op en geven we deze weer, voordat het runspace weer afgesloten wordt.

Voorbeeld code:

Voorbeeld code:


Resultaat:
Parallel verwerken in PowerShell

Conclusie:

Er zijn meerdere manieren om binnen PowerShell meerdere processen parallel naast elkaar te laten draaien. Houd met het aantal parallellen taken rekening met de server capaciteiten, aangezien scripts met complexe functies soms aardig wat geheugen en/of CPU willen gebruiken.

Peter Barendse
DevOps Engineer