Deploying Virtual Machines in Azure using Service Manager and SMA Part II
This is the 2nd post in a 3-part series on deploying VMs in Azure using System Center Service Manager and Service Management Automation (SMA). In this post we’ll cover deploying your Azure VM using PowerShell and SMA.
Part I: Preparing your VM for upload, uploading it to Azure, and configuring Azure
Part II: Deploying your VM in PowerShell and SMA
Part III: Deploying your VM using the Service Manager Self-Service Portal
Summary
The following steps will take you through using PowerShell and SMA to deploy the VM we uploaded in Part I. Each section below will be an argument passed to the PowerShell script and/or SMA Runbook.
Download the Azure Settings File (azureSettingsFile)
- In order for scripts to connect to Azure we need to download an Azure settings file for authentication. You can download this file from the following URL: https://windows.azure.com/download/publishprofile.aspx.
- Note the full path that you downloaded the file. In my testing the file needed to be local where I ran the script so you’ll need it where you’re running the PowerShell script in addition to the server where your SMA Runbook will execute.
Get the name of the VM Image you plan on using (imageName)
- In the Azure Portal, go under Virtual Machines\Images
- I will use w2012r2base3
Get your storage account name where your VHD is stored (azureStorageAccountName)
- In the Azure Portal, go under Storage
- I will use rslaten
Get the name of the Affinity Group you plan on using (affinityGroup)
- In the Azure Portal, go under Settings\Affinity Groups
- I will use Lab
Get the name of the Network you plan on using (networkName)
- In the Azure Portal, go under Networks
- Mine is called Lab
Get the name of the Subnet you plan on using (subnetName)
- In the Azure Portal, go under Networks\<Your Network>\Configure
- I will use subnet-1
Get the following additional information
- azureAccountName: The Microsoft Account name you use to logon to Azure
- adminUserName: The local administrator account you want on the VM
- adminPassword: The local administrator account password you want on the VM
- domain: The FQDN of the domain you want to join
- domainUserName: The domain user to use to join the domain (without the domain\ in front of the user)
- domainPassword: The password for the user account above
- vmName: The name you want the VM to be called. The script will add an integer to the end and keep incrementing it as necessary.
- instanceSize: A0 – A9, see https://msdn.microsoft.com/en-us/library/azure/dn197896.aspx for more information.
Run the script on a machine with Azure PowerShell installed using the following syntax
.\DeployAzureVM.ps1 -azureSettingsFile c:\temp\myAzureSettings.publishsettings –azureAccountName myAzureAccount@myemailaccount.com -imageName w2012r2base3 -vmName rslatenTest -instanceSize A0 -adminUserName rslaten –adminPassword <‘P@$SW0Rd1’> -domain contoso.com -domainUserName rslaten -domainPassword <‘P@$SW0Rd1’> -affinityGroup Lab -networkName Lab -azureStorageAccountName rslaten -subnetName Subnet-1
param(
$azureSettingsFile,
$azureAccountName,
$imageName,
$vmName,
$instanceSize,
$adminUserName,
$adminPassword,
$domain,
$domainUserName,
$domainPassword,
$affinityGroup,
$networkName,
$azureStorageAccountName,
$subnetName
)
#Set Instance Size
if ($instanceSize -eq "A0") { $instanceSize = 'ExtraSmall' }
elseif ($instanceSize -eq "A1") { $instanceSize = 'Small' }
elseif ($instanceSize -eq "A2") { $instanceSize = 'Medium' }
elseif ($instanceSize -eq "A3") { $instanceSize = 'Large' }
elseif ($instanceSize -eq "A4") { $instanceSize = 'ExtraLarge' }
#Import Azure PowerShell Module
Import-Module Azure
#Remove Existing Azure Sessions
Remove-AzureAccount -Name $azureAccountName -Force
#Import Azure Settings File
Import-AzurePublishSettingsFile -PublishSettingsFile $azureSettingsFile
#Set Azure Subscription
Get-AzureSubscription | Set-AzureSubscription -currentstorageaccountname $azureStorageAccountName
#Increment VM Name
$i = 0
foreach ($vm in Get-AzureVM)
{
if ($vm.InstanceName.Contains($vmName))
{
[int]$increment = $vm.InstanceName.SubString($vmName.Length)
if ($increment -gt $i) { $i = $increment }
}
}
$i++
$vmName = $vmName + $i
#Create New Azure Cloud Service
New-AzureService -ServiceName $vmName -AffinityGroup $affinityGroup
#Create Azure VM
if ($domain)
{
New-AzureVMConfig -Name $vmName -InstanceSize $instanceSize -ImageName $imageName |
Add-AzureProvisioningConfig -WindowsDomain -Password $adminPassword -JoinDomain $domain -Domain $domain -DomainUserName $domainUserName -DomainPassword $domainPassword -AdminUsername $adminUserName |
Set-AzureSubnet $subnetName |
New-AzureVM -ServiceName $vmName -VNetName $networkName
}
else
{
New-AzureVMConfig -Name $vmName -InstanceSize $instanceSize -ImageName $imageName |
Add-AzureProvisioningConfig -Windows -AdminUsername $adminUserName -Password $adminPassword |
Set-AzureSubnet $subnetName |
New-AzureVM -ServiceName $vmName -VNetName $networkName
}
- Confirm the VM was created successfully and joined to your domain
Create and Test an SMA Runbook based on this script
- Install Windows PowerShell for Azure (under Command-line tools) on your SMA server
- Logon to the Service Management Portal and click on Automation\Runbooks\New
- Click Quick Create, enter a name for the Runbook such as DeployVMInAzure, and click the Check Mark
- Page over to the new Runbook, click on it, select Author, and click Draft
- Paste in the following script (change the top line if you used something other than DeployVMInAzure as your runbook name)
workflow DeployVMInAzure
{
param(
$azureSettingsFile,
$azureAccountName,
$imageName,
$vmName,
$instanceSize,
$adminUserName,
$adminPassword,
$domain,
$domainUserName,
$domainPassword,
$affinityGroup,
$networkName,
$azureStorageAccountName,
$subnetName
)
#Set Instance Size
if ($instanceSize -eq "A0") { $instanceSize = 'ExtraSmall' }
elseif ($instanceSize -eq "A1") { $instanceSize = 'Small' }
elseif ($instanceSize -eq "A2") { $instanceSize = 'Medium' }
elseif ($instanceSize -eq "A3") { $instanceSize = 'Large' }
elseif ($instanceSize -eq "A4") { $instanceSize = 'ExtraLarge' }
inlinescript
{
#Import Azure PowerShell Module
Import-Module Azure
#Remove Existing Azure Sessions
Remove-AzureAccount -Name $Using:azureAccountName -Force
#Import Azure Settings File
Import-AzurePublishSettingsFile -PublishSettingsFile $Using:azureSettingsFile
#Set Azure Subscription
Get-AzureSubscription | Set-AzureSubscription -currentstorageaccountname $Using:azureStorageAccountName
#Increment VM Name
$i = 0
foreach ($vm in Get-AzureVM)
{
if ($vm.InstanceName.Contains($Using:vmName))
{
[int]$increment = $vm.InstanceName.SubString($Using:vmName.Length)
if ($increment -gt $i) { $i = $increment }
}
}
$i++
$vmName = $Using:vmName + $i
#Create New Azure Cloud Service
New-AzureService -ServiceName $vmName -AffinityGroup $Using:affinityGroup
#Create Azure VM
if ($Using:domain)
{
New-AzureVMConfig -Name $vmName -InstanceSize $Using:instanceSize -ImageName $Using:imageName |
Add-AzureProvisioningConfig -WindowsDomain -Password $Using:adminPassword -JoinDomain $Using:domain -Domain $Using:domain -DomainUserName $Using:domainUserName -DomainPassword $Using:domainPassword -AdminUsername $Using:adminUserName |
Set-AzureSubnet $Using:subnetName |
New-AzureVM -ServiceName $vmName -VNetName $Using:networkName
}
else
{
New-AzureVMConfig -Name $vmName -InstanceSize $Using:instanceSize -ImageName $Using:imageName |
Add-AzureProvisioningConfig -Windows -AdminUsername $Using:adminUserName -Password $Using:adminPassword |
Set-AzureSubnet $Using:subnetName |
New-AzureVM -ServiceName $vmName -VNetName $Using:networkName
}
}
}
- Click Publish
- In the Portal, go back to Runbooks and Start the new Runbook you just created
- Fill in the parameters the same way you did for the PowerShell Script
- Confirm the VM was created successfully and joined to your domain
Continue on to Part III…