Coffee Break – Using Windows PowerShell to provision virtual machines
The previous coffee break was about creating a new Virtual Hard Disk (vhd). This time we will create the rest of the machine (VM) in Microsoft Azure.
Coffee Break 10 – Provisioning (Creating a Virtual Machine (VM) in Azure)
A central part of provisioning a Microsoft Dynamics NAV deployment is of course to provision the actual machine (well the virtual actual one) that the system is running on. The provisioning script on the Microsoft Dynamics NAV product media has two options – both in the “WindowsPowerShellScripts\Cloud\HowTo” folder:
- Example-1VM.ps1 – Provision one VM that runs both SQL Server and Microsoft Dynamics NAV
- Example-2VM.ps1 – Provision two machines, one for SQL Server and one for Microsoft Dynamics NAV
In this post we will keep it simple and just provision one machine. In later posts we will see how to install Microsoft Dynamics NAV on it. This post assumes that you have an Azure account. If you don’t then you can request a free trial here http://azure.microsoft.com/en-gb/pricing/free-trial/ .
Choose an image
In the Azure Management Portal (https://manage.windowsazure.com ), go to New -> Compute -> Virtual Machine -> From Gallery, then pick one, and follow the rest of the steps to create a new VM.
To do this with Windows PowerShell, first connect your PowerShell prompt to your Azure subscription:
Add-AzureAccount
Use Get-AzureVMImage to get a list of available images:
Get-AzureVMImage | select ImageFamily | Group-Object ImageFamily | Format-Table –AutoSize
Browse through that list and choose any image you like. For this example let’s pick one that already has SQL Server installed:
$imageFamily = “SQL Server 2014 RTM Standard on Windows Server 2012 R2”
The image library on Azure is very much alive and keeps changing as machines get updated. This will choose the latest version of the image family you chose:
$imageName = Get-AzureVMImage | where { $_.ImageFamily -eq $imageFamily } | sort PublishedDate -Descending | select -ExpandProperty ImageName -First 1
The VM you make will live in a Service. The Service name must be unique world-wide. So pick a Service name:
$ServiceName = “mytestserviceabcdef”
Test-AzureName –Service $ServiceName
Test-AzureName returns True if someone somewhere in the world already picked the name you specified. You must update ServiceName until Test-AzureName returns False.
Next, decide on the name of your VM. This only has to be unique for yourself:
$Name = “NAVPC”
Then we are ready for the main event!
Creating a new VM
In Windows PowerShell:
New-AzureQuickVM –ImageName $imageName –ServiceName $ServiceName –Name $Name –Windows –Location “West Europe” –AdminUsername vmadmin -Password “HelloWorld2” –WaitForBoot
Notice the last parameter here –WaitForBoot. New-AzureQuickVM will provision and boot a new VM. If we specify –WaitForBoot, then the command will not complete until the new VM is booted (or failed), which can take 5-10-15 minutes or more or less. If you want the command to return sooner, then run it without this parameter. In that case, go to “Virtual Machines” in your Azure portal, and refresh to see status of your new VM while it is provisioning. Or watch status from PowerShell:
Get-AzureVM –ServiceName $ServiceName –Name $Name
Or to have a loop that checks and updates every 5 seconds, look in the provisioning tool in NAVRemoteAdministration\Azure\Wait-VMReadyState.ps1. With this method, if a user is waiting for the script to finish then at least they know that it is processing.
If the script fails the first (few) times, then second time you run it you may get error that Service already exists. In this case, go to “Cloud Services” in your Azure portal, and clean up (delete the service that was created). Or do it via PowerShell:
Remove-AzureService $ServiceName
After this, you should have your new VM ready and you can connect to it from the Azure portal. Or if you find it hard to leave your favourite environment (ISE), connect to your new machine directly from PowerShell:
Get-AzureRemoteDesktopFile –ServiceName $ServiceName –Name $Name –LocalPath c:\Temp\remote.rdp
c:\Temp\remote.rdp
Jasminka Thunes, Escalation Engineer Dynamics NAV EMEA
Lars Lohndorf-Larsen, Escalation Engineer Dynamics NAV EMEA
Bas Graaf, Senior Software Engineer Dynamics NAV