Azure Resource Manager IaaS via PowerShell
Recently, I have been working through the Managing Azure IaaS with PowerShell class by Elton Stoneman. This is hands down the best class I have taken on Azure. It gets right to the heart of becoming an Azure wizard with PowerShell. I highly recommend taking the class yourself.
Below are my notes from the first module of the class for reference in the future.
Setting Up Azure PowerShell
To install the Azure Resource Manager PowerShell module you need to be using at least PowerShell 3 or above on a Windows based OS.
You will also need PowerShellGet installed. This comes preinstalled on Windows 10, but you can install it manually. PowerShellGet is similar to NuGet for .NET.
There are three steps needed to begin using Azure PowerShell:
Allow PS scripts to be executed on your machine by running the
Set-ExecutionPolicy command while running in an elevated instance of PowerShell.
Then install Azure PowerShell via PowerShellGet using the
Install-Module command. This will take a while, so go get some coffee.
Finally, we need to authenticate to Azure using the
Login-AzureRmAccount. This will popup an authentication dialog where you use your Azure credentials.
You can view the subscriptions available to this account with
Get-AzureRmSubscription. If you have more than one, you can set one to default with
Get-AzureRmSubscription –SubscriptionName "Free Trial" | Select-AzureRmSubscription
Creating a Resource Group & Storage Account
You can create an Azure Resource Group and then attach any virtual machine, load balancer or other resource to it. This is a nice way to package all the resources for a given project together. You can even remove everything easily, but deleting the resource group. All the resources attached to it will be deleted as well.
To create a Resource Group, you need to give it a name and a location. A full list of Data Center Locations can be found here or via the
Before you can create a virtual machine or any resource that requires storage, you will need a Storage Account.
$location = "West US" $resourceGroupName = "funky-bunch" $storageAccountName = "funky-bunch-storage" New-AzureRmResourceGroup -Name $resourceGroupName ` -Location $location $storageAccount = New-AzureRmStorageAccount -Name $storageAccountName ` -ResourceGroupName $resourceGroupName ` -Location $location ` -Type Standard_LRS
Note: For the remainder of this post, I will assume that the variables that are defined are available for the rest of the post. The variables
$storageAccount will be used below.
Creating a Virtual Network
$virtualNetworkName = "funky-bunch-net" $subnet = New-AzureRmVirtualNetworkSubnetConfig -Name frontendSubnet ` -AddressPrefix 10.0.1.0/24 $virtualNetwork = New-AzureRmVirtualNetwork -Name $virtualNetworkName ` -ResourceGroupName $resourceGroupName ` -Location $location ` -Subnet $subnet ` -AddressPrefix 10.0.0.0/16
Creating a Public IP & Network Interface
$networkInterfaceName = "vm1-nic" $publicIP = New-AzureRmPublicIpAddress -Name $networkInterfaceName ` -ResourceGroupName $resourceGroupName ` -Location $location ` -AllocationMethod Dynamic $networkInterface = New-AzureRmNetworkInterface -Name $networkInterfaceName ` -ResourceGroupName $resourceGroupName ` -Location $location ` -SubnetId $virtualNetwork.Subnets.Id ` -PublicIpAddressId $publicIP.Id
Creating a Simple Windows VM
To create a virtual machine, you need a base image to start with. Azure hosts tons of base images to choose from out of the box. Images are offed by Microsoft and other partners. You can get a list of the partners, what the offer and all available SKUs easily enough with
Get-AzureRmVMImagePublisher -Location $location Get-AzureRmVMImageOffer -PublisherName "MicrosoftWindowsServer" ` -Location $location Get-AzureRmVMImageSku -PublisherName "MicrosoftWindowsServer" ` -Offer "windowsserver" ` -Location $location
Once we have a base image selected, we need to create our administration account credentials as well as a location in our storage account to store our virtual machine hard drive image.
$vmName = "funky-bunch-win-web" $credentials = Get-Credential -Message "Admin Credentials for VM" $operatingSystemDiskUri = $storageAccount.PrimaryEndpoints.Blob.ToString() ` + "vhds/" + $vmName + ".vhd" $vm = NewAzureRmVmConfig -VMName $vmName -VMSize "Basic_A1" $vm = Set-AzureRmVMOperatingSystem -VM $vm -ComputerName $vmName ` -Credential $credentials ` -ProvisionVMAgent -EnableAutoUpdate $vm = Set-AzureRmVMSourceImage -VM $vm ` -PublisherName "MicrosoftWindowsServer" ` -Offer "WindowsServer" ` -Skus "2012-R2-Datacenter" -Version "latest" $vm = Add-AzureRmVMNetworkInterface -VM $vm -Id $networkInterface.Id $vm = Set-AzureRmVMOSDisk -VM $vm -Name $vmName -CreateOption fromImage ` -VhdUri $operatingSystemDiskUri New-AzureRmVM -VM $vm -ResourceGroupName $resourceGroupName -Location $location
Once complete, you can retrieve details about your VM, Network Interface and Public IP (used to connect via RDP) by using the
Get-AzurePublic commands. Each of these commands will return a JSON object containing all the properties of the object you requested.
Get-AzureRmVM -Name $vmName -ResourceGroupName $resourceGroupName Get-AzureRmNetworkInterface -Name $networkInterfaceName ` -ResourceGroupName $resourceGroupName Get-AzureRmPublicIpAddress - Name $networkInterfaceName ` -ResourceGroupName $resourceGroupName
The process for creating a linux virtual machine is identical, simply use the commands detailed above to find a linux base image.
Get-AzureRmVMImageOffer -PublisherName "Cononical" -Location $location Get-AzureRmVMImageSku -PublisherName "Cononical" -Offer "UbuntuServer" ` -Location $location
With these basic building blocks, you can create as intricate of an infrastructure as you need. Completely scripted and reproducible. Elton goes into much greater detail including creating your own custom images, load balancers and ARM templates. You should definitely go check it out.