Skip to main content

Using Start-Job with Azure

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

Popular posts from this blog

How to list all the AD LDS instances on a server

AD LDS allows you to provide directory services to applications that are free of the confines of Active Directory.  To list all the AD LDS instances on a server, follow this procedure: Log into the server in question Open a command prompt. Type dsdbutil and press Enter Type List Instances and press Enter . You will receive a list of the instance name, both the LDAP and SSL port numbers, the location of the database, and its status.

How to run GPResult on a remote client with PowerShell

In the past, to run the GPResult command, you would need to either physically visit this client, have the user do it, or use and RDP connection.  In all cases, this will disrupt the user.  First, you need PowerShell remoting enabled on the target machine.  You can do this via Group Policy . Open PowerShell and type this command. Invoke-Command –ScriptBlock {GPResult /r} –ComputerName <ComputerName> Replace <ComputerName> with the name of the target.  Remember, the target needs to be online and accessible to you.

Error icon when creating a GPO Preference drive map

You may not have an error at all.  Take a look at the drive mapping below. The red triangle is what threw us off.  It is not an error.  It is simply a color representation of the Replace option of the Action field in the properties of the drive mappings. Create action This give you a green triangle. The Create action creates a new mapped drive for users. Replace Action The Replace action gives you a red triangle.  This action will delete and recreate mapped drives for users. The net result of the Replace action is to overwrite all existing settings associated with the mapped drive. If the drive mapping does not exist, then the Replace action creates a new drive mapping. Update Action The Update action will have a yellow triangle. Update will modify settings of an existing mapped drive for users. This action differs from Replace in that it only updates settings defined within the preference item. All other settings remain as configured on the mapped drive. If the