Microsoft Azure: Azure Managed Disk

Microsoft has rolled out Azure Managed Disks this month and its available for all to simplify the management, scaling, sizing of disk, etc for VMs.

Since i am still pretty much a .Net guy so download the Azure Management Libraries for .Net to manage Managed Disks.

GitHub Link: https://github.com/Azure/azure-sdk-for-net/tree/Fluent

Time to play 🙂

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Virtual Machine with Managed Disk
​var linuxVM1 = azure.VirtualMachines
.Define(linuxVM1Name)
.WithRegion(Region.USEast)
.WithNewResourceGroup(rgName)
.WithNewPrimaryNetwork ("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithNewPrimaryPublicIpAddress(linuxVM1Pip)
.WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
.WithRootUsername(“tirekicker”)
.WithSsh(sshkey)
.WithNewDataDisk(100)
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
Virtual Machine with Managed Disk ​ ​var linuxVM1 = azure.VirtualMachines .Define(linuxVM1Name) .WithRegion(Region.USEast) .WithNewResourceGroup(rgName) .WithNewPrimaryNetwork ("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithNewPrimaryPublicIpAddress(linuxVM1Pip) .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts) .WithRootUsername(“tirekicker”) .WithSsh(sshkey) .WithNewDataDisk(100) .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create();
Virtual Machine with Managed Disk
​
​var linuxVM1 = azure.VirtualMachines
  .Define(linuxVM1Name)
  .WithRegion(Region.USEast)
  .WithNewResourceGroup(rgName)
  .WithNewPrimaryNetwork ("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithNewPrimaryPublicIpAddress(linuxVM1Pip)
  .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
  .WithRootUsername(“tirekicker”)
  .WithSsh(sshkey)
  .WithNewDataDisk(100)
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

Things to note: Its quite simple, easy and quick to create managed disks without specifying all the disk details and you don’t need to worry about Managing Storage Accounts anymore. Use define()…create() method chain to create a VM with Managed Disk for OS and explicit Managed Disks for data.

VM Scale Set with Managed Disks

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var vmScaleSet = azure.VirtualMachineScaleSets
.Define(vmScaleSetName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithSku(VirtualMachineScaleSetSkuTypes.StandardD5v2)
.WithExistingPrimaryNetworkSubnet(network, "subnet1")
.WithExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer)
.WithoutPrimaryInternalLoadBalancer()
.WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
.WithRootUsername("tirekicker")
.WithSsh(sshkey)
.WithNewDataDisk(100)
.WithNewDataDisk(100, 1, CachingTypes.ReadWrite)
.WithNewDataDisk(100, 2, CachingTypes.ReadOnly)
.WithCapacity(3)
.Create();
​var vmScaleSet = azure.VirtualMachineScaleSets .Define(vmScaleSetName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithSku(VirtualMachineScaleSetSkuTypes.StandardD5v2) .WithExistingPrimaryNetworkSubnet(network, "subnet1") .WithExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer) .WithoutPrimaryInternalLoadBalancer() .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts) .WithRootUsername("tirekicker") .WithSsh(sshkey) .WithNewDataDisk(100) .WithNewDataDisk(100, 1, CachingTypes.ReadWrite) .WithNewDataDisk(100, 2, CachingTypes.ReadOnly) .WithCapacity(3) .Create();
​var vmScaleSet = azure.VirtualMachineScaleSets
  .Define(vmScaleSetName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithSku(VirtualMachineScaleSetSkuTypes.StandardD5v2)
  .WithExistingPrimaryNetworkSubnet(network, "subnet1")
  .WithExistingPrimaryInternetFacingLoadBalancer(publicLoadBalancer)
  .WithoutPrimaryInternalLoadBalancer()
  .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
  .WithRootUsername("tirekicker")
  .WithSsh(sshkey)
  .WithNewDataDisk(100)
  .WithNewDataDisk(100, 1, CachingTypes.ReadWrite)
  .WithNewDataDisk(100, 2, CachingTypes.ReadOnly)
  .WithCapacity(3)
  .Create();

Attach Empty Managed Disk to VM
Like mentioned above, by using define().. create() you can accomplish this.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var dataDisk = azure.Disks.Define(diskName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithData()
.WithSizeInGB(50)
.Create();
​var dataDisk = azure.Disks.Define(diskName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithData() .WithSizeInGB(50) .Create();
​var dataDisk = azure.Disks.Define(diskName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithData()
  .WithSizeInGB(50)
  .Create();

Again define()… create() method, this time to attach the empty Managed Disk to VM

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var linuxVM2 = azure.VirtualMachines.Define(linuxVM2Name)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithNewPrimaryNetwork ("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithNewPrimaryPublicIpAddress(linuxVM2Pip)
.WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
.WithRootUsername("tirekicker")
.WithSsh(sshkey)
.WithNewDataDisk(100)
.WithNewDataDisk(100, 1, CachingTypes.ReadWrite)
.WithExistingDataDisk(dataDisk)
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
​var linuxVM2 = azure.VirtualMachines.Define(linuxVM2Name) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithNewPrimaryNetwork ("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithNewPrimaryPublicIpAddress(linuxVM2Pip) .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts) .WithRootUsername("tirekicker") .WithSsh(sshkey) .WithNewDataDisk(100) .WithNewDataDisk(100, 1, CachingTypes.ReadWrite) .WithExistingDataDisk(dataDisk) .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create();
​var linuxVM2 = azure.VirtualMachines.Define(linuxVM2Name)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithNewPrimaryNetwork ("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithNewPrimaryPublicIpAddress(linuxVM2Pip)
  .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
  .WithRootUsername("tirekicker")
  .WithSsh(sshkey)
  .WithNewDataDisk(100)
  .WithNewDataDisk(100, 1, CachingTypes.ReadWrite)
  .WithExistingDataDisk(dataDisk)
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

To detach Managed Disks and attach new Managed Disks, you have to use an update() … apply() method chain

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​linuxVM2.Update()
.WithoutDataDisk(2)
.WithNewDataDisk(200)
.Apply();
​linuxVM2.Update() .WithoutDataDisk(2) .WithNewDataDisk(200) .Apply();
​linuxVM2.Update()
  .WithoutDataDisk(2)
  .WithNewDataDisk(200)
  .Apply();

VM from a Specialized VHD

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var linuxVM4 = azure.VirtualMachines.Define(linuxVmName3)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithNewPrimaryNetwork("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithoutPrimaryPublicIpAddress()
.WithSpecializedOsUnmanagedDisk(specializedVhd, OperatingSystemTypes.Linux)
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
​var linuxVM4 = azure.VirtualMachines.Define(linuxVmName3) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithNewPrimaryNetwork("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithoutPrimaryPublicIpAddress() .WithSpecializedOsUnmanagedDisk(specializedVhd, OperatingSystemTypes.Linux) .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create();
​var linuxVM4 = azure.VirtualMachines.Define(linuxVmName3)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithNewPrimaryNetwork("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithoutPrimaryPublicIpAddress()
  .WithSpecializedOsUnmanagedDisk(specializedVhd, OperatingSystemTypes.Linux)
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

VM using a Custom Image

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var virtualMachineCustomImage = azure.VirtualMachineCustomImages
.Define(customImageName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.FromVirtualMachine(linuxVM) // from a de-allocated and generalized Virtual Machine
.Create();
​var virtualMachineCustomImage = azure.VirtualMachineCustomImages .Define(customImageName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .FromVirtualMachine(linuxVM) // from a de-allocated and generalized Virtual Machine .Create();
​var virtualMachineCustomImage = azure.VirtualMachineCustomImages
  .Define(customImageName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .FromVirtualMachine(linuxVM) // from a de-allocated and generalized Virtual Machine
  .Create();

Custom Image with define()…create() method

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var linuxVM4 = azure.VirtualMachines.Define(linuxVM4Name)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithNewPrimaryNetwork("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithoutPrimaryPublicIpAddress()
.WithLinuxCustomImage(virtualMachineCustomImage.Id)
.WithRootUsername(userName)
.WithSsh(sshkey)
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
​var linuxVM4 = azure.VirtualMachines.Define(linuxVM4Name) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithNewPrimaryNetwork("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithoutPrimaryPublicIpAddress() .WithLinuxCustomImage(virtualMachineCustomImage.Id) .WithRootUsername(userName) .WithSsh(sshkey) .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create();
​var linuxVM4 = azure.VirtualMachines.Define(linuxVM4Name)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithNewPrimaryNetwork("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithoutPrimaryPublicIpAddress()
  .WithLinuxCustomImage(virtualMachineCustomImage.Id)
  .WithRootUsername(userName)
  .WithSsh(sshkey)
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

VM Using Specialized Disks from Snapshot

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// Create a Snapshot for an operating system disk
var osDisk = azure.Disks.GetById(linuxVM.OsDiskId);
var osSnapshot = azure.Snapshots.Define(managedOSSnapshotName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithLinuxFromDisk(osDisk)
.Create();
// Create a Managed Disk from the Snapshot for the operating system disk
var newOSDisk = azure.Disks.Define(managedNewOSDiskName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithLinuxFromSnapshot(osSnapshot)
.WithSizeInGB(100)
.Create();
// Create a Snapshot for a data disk
var dataSnapshot = azure.Snapshots.Define(managedDataDiskSnapshotName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithDataFromDisk(dataDisk)
.WithSku(DiskSkuTypes.StandardLRS)
.Create();
// Create a Managed Disk from the Snapshot for the data disk
var newDataDisk = azure.Disks.Define(managedNewDataDiskName)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithData()
.FromSnapshot(dataSnapshot)
.Create();
var linuxVM5 = azure.VirtualMachines.Define(linuxVm5Name)
.WithRegion(Region.USEast)
.WithExistingResourceGroup(rgName)
.WithNewPrimaryNetwork("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithoutPrimaryPublicIpAddress()
.WithSpecializedOsDisk(newOSDisk, OperatingSystemTypes.Linux)
.WithExistingDataDisk(newDataDisk)
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
// Create a Snapshot for an operating system disk var osDisk = azure.Disks.GetById(linuxVM.OsDiskId); var osSnapshot = azure.Snapshots.Define(managedOSSnapshotName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithLinuxFromDisk(osDisk) .Create(); // Create a Managed Disk from the Snapshot for the operating system disk var newOSDisk = azure.Disks.Define(managedNewOSDiskName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithLinuxFromSnapshot(osSnapshot) .WithSizeInGB(100) .Create(); // Create a Snapshot for a data disk var dataSnapshot = azure.Snapshots.Define(managedDataDiskSnapshotName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithDataFromDisk(dataDisk) .WithSku(DiskSkuTypes.StandardLRS) .Create(); // Create a Managed Disk from the Snapshot for the data disk var newDataDisk = azure.Disks.Define(managedNewDataDiskName) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithData() .FromSnapshot(dataSnapshot) .Create(); var linuxVM5 = azure.VirtualMachines.Define(linuxVm5Name) .WithRegion(Region.USEast) .WithExistingResourceGroup(rgName) .WithNewPrimaryNetwork("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithoutPrimaryPublicIpAddress() .WithSpecializedOsDisk(newOSDisk, OperatingSystemTypes.Linux) .WithExistingDataDisk(newDataDisk) .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create();
// Create a Snapshot for an operating system disk
var osDisk = azure.Disks.GetById(linuxVM.OsDiskId);
var osSnapshot = azure.Snapshots.Define(managedOSSnapshotName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithLinuxFromDisk(osDisk)
  .Create();

// Create a Managed Disk from the Snapshot for the operating system disk
var newOSDisk = azure.Disks.Define(managedNewOSDiskName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithLinuxFromSnapshot(osSnapshot)
  .WithSizeInGB(100)
  .Create();

// Create a Snapshot for a data disk
var dataSnapshot = azure.Snapshots.Define(managedDataDiskSnapshotName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithDataFromDisk(dataDisk)
  .WithSku(DiskSkuTypes.StandardLRS)
  .Create();

// Create a Managed Disk from the Snapshot for the data disk
var newDataDisk = azure.Disks.Define(managedNewDataDiskName)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithData()
  .FromSnapshot(dataSnapshot)
  .Create();

var linuxVM5 = azure.VirtualMachines.Define(linuxVm5Name)
  .WithRegion(Region.USEast)
  .WithExistingResourceGroup(rgName)
  .WithNewPrimaryNetwork("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithoutPrimaryPublicIpAddress()
  .WithSpecializedOsDisk(newOSDisk, OperatingSystemTypes.Linux)
  .WithExistingDataDisk(newDataDisk)
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

Convert VM to Use Managed Disk with a Single Rebot

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
​var linuxVM6 = azure.VirtualMachines.Define(linuxVM6Name)
.WithRegion(Region.USEast)
.WithNewResourceGroup(rgName)
.WithNewPrimaryNetwork("10.0.0.0/28")
.WithPrimaryPrivateIpAddressDynamic()
.WithNewPrimaryPublicIpAddress(linuxVM6Pip)
.WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
.WithRootUsername("tirekicker")
.WithSsh(sshkey)
.WithUnmanagedDisks() // uses Storage Account
.WithNewUnmanagedDataDisk(100) // uses Storage Account
.WithSize(VirtualMachineSizeTypes.StandardD3V2)
.Create();
linuxVM7.Deallocate();
linuxVM7.ConvertToManaged();
​var linuxVM6 = azure.VirtualMachines.Define(linuxVM6Name) .WithRegion(Region.USEast) .WithNewResourceGroup(rgName) .WithNewPrimaryNetwork("10.0.0.0/28") .WithPrimaryPrivateIpAddressDynamic() .WithNewPrimaryPublicIpAddress(linuxVM6Pip) .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts) .WithRootUsername("tirekicker") .WithSsh(sshkey) .WithUnmanagedDisks() // uses Storage Account .WithNewUnmanagedDataDisk(100) // uses Storage Account .WithSize(VirtualMachineSizeTypes.StandardD3V2) .Create(); linuxVM7.Deallocate(); linuxVM7.ConvertToManaged();
​var linuxVM6 = azure.VirtualMachines.Define(linuxVM6Name)
  .WithRegion(Region.USEast)
  .WithNewResourceGroup(rgName)
  .WithNewPrimaryNetwork("10.0.0.0/28")
  .WithPrimaryPrivateIpAddressDynamic()
  .WithNewPrimaryPublicIpAddress(linuxVM6Pip)
  .WithPopularLinuxImage(KnownLinuxVirtualMachineImage.UbuntuServer16_04_Lts)
  .WithRootUsername("tirekicker")
  .WithSsh(sshkey)
  .WithUnmanagedDisks() // uses Storage Account
  .WithNewUnmanagedDataDisk(100) // uses Storage Account
  .WithSize(VirtualMachineSizeTypes.StandardD3V2)
  .Create();

linuxVM7.Deallocate();
linuxVM7.ConvertToManaged();

Enjoy guys and plenty more is coming 🙂

Leave a Reply