Today I am like a kid playing with Legos. I’m prepped and
ready for the PowerShell Conference in Asia so I’m working on Plan B. Wait, what?
I just said that I was prepped and ready. I am, but that does not mean that I am going
to rest. I am delivering a workshop on
learning PowerShell, but we are using the attendee’s local computer. My Plan B is to provide everybody with a
virtual environment to play in for the day using Azure.
My goal is to take everyone’s email address and create a VM
in Azure for them. I want to provision
them live. The problem with this is that
if I do sequentially, it will take more than 4 hours to complete. So, it is time to use background jobs. When done sequentially, the task completes without any problems. When performed using Start-Job, my Azure
credentials are not passed into the ScriptBlock parameter of Start-Job.
Azure team
member Mark Cowlishaw published a fix for this issue on GitHub. Here is his solution:
$path = ".\profile.json"
$deploy = {
Select-AzureRmProfile
-Path $path
Get-AzureRMResourceGroup
}
Save-AzureRmProfile -Path $path
$job = Start-Job -ScriptBlock $deploy
Wait-Job $job
Receive-Job $job
To show you how to use it in practice, here is my test code
to remove all of the Azure resources that each test run creates.
$path = "$env:USERPROFILE\documents\WindowsPowerShell\profile.json"
$Number = 18
For ($X
= 0 ; $X
-lt $Number + 1;
$X++)
{
$name
= "NC"+$X
Start-Job -ArgumentList $Name,
$Path `
-Name
$Name `
-ScriptBlock
{
Param ($Name, $Path)
Select-AzureRmProfile
-Path $path
Get-AzureRMResourceGroup
Remove-AzureRmResourceGroup
-Name $Name
-Force -Verbose
}
}
A slightly different implementation than what Mark proposed,
but only because some of my code is very large.
In short, it works. I am about to
take a sequential 4 hour + build of the Virtual Machines and reduce this task to about 16 minutes
with background jobs.
I may just have an awesome opening demonstration of
automation at the beginning of my presentation.
See you all next week from Singapore!
Comments