Hi
all,
This is just a quick blog post to demonstrate how to
provision an IaaS environment in Azure with the VM DSC extension to instantiate
a new Web Server (IIS).
Say what?
You have probably seen many examples of this already, so I
won’t try to sell you something new here.
However, I want to point out the difference of using an
Azure Resource Manager template (.json, declarative) compared to using
PowerShell – in an imperative way.
The reason for this blog post is the newly released
AzureRM PowerShell module which introduces us to a new set of cmdlets (the
downside here is that I am now forced to update the whitepaper… https://gallery.technet.microsoft.com/Cloud-Consistency-with-0b79b775
).
Where we are
coming from
Previously with the Service Management API, we normally
created our virtual machines in a similar way to this:
$image = Get-AzureVMImage -ImageName
"a699494373c04fc0bc8f2bb1389d6106__Windows-Server-2012-R2-201412.01-en.us-127GB.vhd"
$vnet = Get-AzureVNetSite
$vm = New-AzureVMConfig -Name
$VMName -InstanceSize
"Basic_A2" -ImageName $image.ImageName
### Deploy a new domain joined VM
$vm = Add-AzureProvisioningConfig -VM
$vm -AdminUsername
$username -Password
$pwd -WindowsDomain
-JoinDomain "azure.systemcenter365.com"
-Domain "azure"
-DomainUserName "knadm"
-DomainPassword "superPWD"
| Set-AzureSubnet
-SubnetNames $vnet.subnets.name
| Set-AzureStaticVNetIP
-IPAddress "10.0.40.52"
New-AzureVM -VM $vm -Location "North Europe" -VNetName
$vnet.name
-ServiceName $ServiceName
-Verbose -WaitForBoot
Also, if I wanted to add DSC to my VM using the Service
Management API, I would have to do something like this:
# Fire and forget some DSC
$dscvm = Get-AzureVM -ServiceName
$ServiceName -Name
$VMName
Set-AzureVMDSCExtension -VM $dscvm -ConfigurationArchive "azureDSCDemo.ps1.zip"
-ConfigurationName "tester"
| Update-AzureVM
This has drastically changed with Azure Resource Manager,
which introduces us to a new world with a lot of more opportunities (someone
would also say more complexity).
Where we are going
In order to show you where we are heading with this, I
would like to point you to my GitHub repo where you can find some learning
examples on how this looks like by using Azure Resource Manager templates – but also the new AzureRM
PowerShell module
ARM Template with
a single-button deployment + PowerShell cmdlet for deployment
PowerShell script
using the new AzureRM Module to create IaaS environment with DSC
Here’s the example using PowerShell:
# Connect to your Azure subscription
Add-AzureRmAccount -Credential (get-credential)
# Add some variables that you will use as you move forward
# Global
$RGname = "KNRGTest01"
$Location = "west europe"
# Storage
$StorageName =
"Knstor5050"
$StorageType =
"Standard_LRS"
# Network
$vnicName = "vmvNic"
$Subnet1Name = "Subnet1"
$vNetName = "KNVnet01"
$vNetAddressPrefix = "192.168.0.0/16"
$vNetSubnetAddressPrefix = "192.168.0.0/24"
# Compute
$VMName = "KNVM01"
$ComputerName = $VMName
$VMSize = "Standard_A2"
$OSDiskName = $VMName + "osDisk"
# Create a new Azure Resource Grou
$RG = New-AzureRmResourceGroup -Name
$RGname -Location
$location -Verbose
# Create Storage
$StorageAccount = New-AzureRmStorageAccount
-ResourceGroupName $RGname
-Name knstor5050
-Type $StorageType
-Location $Location
# Create Network
$PIP = New-AzureRmPublicIpAddress -Name
$vnicName -ResourceGroupName
$RGname -Location
$Location -AllocationMethod
Dynamic
$SubnetConfig = New-AzureRmVirtualNetworkSubnetConfig
-Name $Subnet1Name
-AddressPrefix $vNetSubnetAddressPrefix
$vNET = New-AzureRmVirtualNetwork -Name
$vNetName -ResourceGroupName
$RGname -Location
$Location -AddressPrefix
$vNetAddressPrefix -Subnet $SubnetConfig
$Interface = New-AzureRmNetworkInterface
-Name $vnicName
-ResourceGroupName $RGname
-Location $Location
-SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
# Create Compute
# Setup local VM object
$Credential = Get-Credential
$VirtualMachine = New-AzureRmVMConfig
-VMName $VMName
-VMSize $VMSize
$VirtualMachine = Set-AzureRmVMOperatingSystem
-VM $VirtualMachine
-Windows -ComputerName
$ComputerName -Credential
$credential -ProvisionVMAgent
-EnableAutoUpdate
$VirtualMachine = Set-AzureRmVMSourceImage
-VM $VirtualMachine
-PublisherName MicrosoftWindowsServer
-Offer WindowsServer
-Skus 2012-R2-Datacenter
-Version "latest"
$VirtualMachine = Add-AzureRmVMNetworkInterface
-VM $VirtualMachine
-Id $interface.Id
$OSDiskUri = $StorageAccount.PrimaryEndpoints.Blob.ToString() +
"vhds/" +
$OSDiskName +
".vhd"
$VirtualMachine = Set-AzureRmVMOSDisk
-VM $VirtualMachine
-Name $OSDiskName
-VhdUri $OSDiskUri
-CreateOption fromImage
# Deploy the VM in Azure
New-AzureRmVM -ResourceGroupName
$RGname -Location
$Location -VM
$VirtualMachine
# Publish DSC config to your newly created storage account
Publish-AzureRmVMDscConfiguration -ResourceGroupName $RGname
-ConfigurationPath .\webdsc.ps1
-StorageAccountName knstor5050
# Add DSC Extension with config to the newly created VM
Set-AzureRmVMDscExtension -ResourceGroupName $RGname
-VMName $virtualmachine.Name -ArchiveBlobName
webdsc.ps1.zip -ArchiveStorageAccountName
knstor5050 -ConfigurationName
webdsc -Version
2.7 -Location
$location
#
Good night
Please have a look at these examples, and I encourage you
to explore the new opportunities with the AzureRM module.
No comments:
Post a Comment