Expand-AzureRMVMOSDiskRunbook.ps1

<#PSScriptInfo
.VERSION 1.1.0
.GUID db10bd5a-4fb3-4058-8c46-d2044aeb258e
.AUTHOR Arjun Bahree
.COMPANYNAME
.COPYRIGHT (c) 2018 Arjun Bahree. All rights reserved.
.TAGS Windows PowerShell Azure AzureAutomation Runbooks AzureManagedDisk AzureUnmanagedDisk AzureStorage
.LICENSEURI https://github.com/bahreex/Bahree-PowerShell-Library/blob/master/LICENSE
.PROJECTURI https://github.com/bahreex/Bahree-PowerShell-Library/tree/master/Azure%20Automation%20Runbooks
.ICONURI
.EXTERNALMODULEDEPENDENCIES AzureRM
.REQUIREDSCRIPTS
.EXTERNALSCRIPTDEPENDENCIES
.RELEASENOTES
#>
 

<#
.DESCRIPTION
Lets you Increase the OS Disk Size for an Azure RM VM as a Runbook from within an Azure Automation Account.
#>


<#
.SYNOPSIS
    Lets you Increase the OS Disk Size for an Azure RM VM as a Runbook from within an Azure Automation Account.
 
.DESCRIPTION
    This Runbook lets you Increase the OS Disk size for a VM. OS Disk Size reduction is not supported by Azure. It
    supports OS Disk resizing for both Managed and Unmanaged disks. You need to execute this Runbook through a
    'Azure Run As account (service principal)' Identity from an Azure Automation account.
 
.PARAMETER ResourceGroupName
    Name of the Resource Group containing the VM, whose OS Disk you want to resize
 
.PARAMETER VMName
    Name of the VM whose OS Disk you want to resize
 
.PARAMETER NewOSDiskSize
    New Size of OS Disk
 
.EXAMPLE
    .\Expand-AzureRMVMOSDisk -ResourceGroupName "RG1" -VMName "VM01" -NewOSDiskSize 1023
     
.Notes
    Author: Arjun Bahree
    E-mail: arjun.bahree@gmail.com
    Creation Date: 23/Dec/2017
    Last Revision Date: 15/Jan/2018
    Development Environment: Azure Automation Runbook Editor and VS Code IDE
    PS Version: 5.1
    Platform: Windows
#>


param(

    [Parameter(Mandatory=$true)] 
    [String]$ResourceGroupName,
    
    [Parameter(Mandatory=$true)] 
    [String]$VMName,

    [Parameter(Mandatory=$true)]
    [ValidateRange(30,2048)]
    [int]$NewOSDiskSize
)

if (!(Get-AzureRmContext).Account) {
    $connectionName = "AzureRunAsConnection"
    try {
        # Get the connection "AzureRunAsConnection "
        $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName         
    
        Add-AzureRmAccount `
            -ServicePrincipal `
            -TenantId $servicePrincipalConnection.TenantId `
            -ApplicationId $servicePrincipalConnection.ApplicationId `
            -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint > $null
    }
    catch {
        if (!$servicePrincipalConnection) {
            $ErrorMessage = "Connection $connectionName not found."
            throw $ErrorMessage
        }
        else {
            Write-Error -Message $_.Exception
            throw $_.Exception
        }
    }
}

Write-Output "Getting VM reference..."
# Get the VM in context
$vm = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName

if ($vm)
{
    if ($vm.StorageProfile.OSDisk.DiskSizeGB -ge $NewOSDiskSize)
    {
        Write-Error "The new OS Disk size should be greater than existing OS Disk size. Disk size reduction or same Disk size allocation not supported."
        return
    }

    Write-Output "Checking if the VM has a Managed disk or Unmanaged disk..."
    # If VM has Unamanged Disk
    if (!$vm.StorageProfile.OsDisk.ManagedDisk)
    {   
        Write-Output "The VM has Unmanaged OS Disk."

        Write-Output "Getting VM Status..."
        # Get current status of the VM
        $vmstatus = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status
    
        Write-Output "Checking if VM is in a Running State..."
        If ($vmstatus.Statuses.Code -contains "PowerState/running")
        {
            Write-Output "Stopping the VM as it is in a Running State..."
            $stopVM = Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
        }

        Write-Output "Changing Unmanaged OS Disk Size..."
        
        # Change the OS Disk Size
        $vm.StorageProfile.OSDisk.DiskSizeGB = $NewOSDiskSize

        # Update the VM to apply OS Disk change
        $resizeOps = Update-AzureRmVM -ResourceGroupName $ResourceGroupName -VM $vm
    }
    else 
    {    
        Write-Output "The VM Has Managed OS Disk."

        Write-Output "Getting VM Status..."
        # Get current status of the VM
        $vmstatus = Get-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -Status
    
        Write-Output "Checking if VM is in a Running State..."
        If ($vmstatus.Statuses.Code -contains "PowerState/running")
        {
            Write-Output "Stopping the VM as it is in a Running State..."
            $stopVM = Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -Force
        }
        
        Write-Output "Changing Managed OS Disk Size..."

        # Get OS Disk for the VM in context
        $vmDisk = Get-AzureRmDisk -ResourceGroupName $ResourceGroupName -DiskName $vm.StorageProfile.OSDisk.Name
        
        # Change the OS Disk Size
        $vmDisk.DiskSizeGB = $NewOSDiskSize

        # Update the Disk
        $resizeOps = Update-AzureRmDisk -ResourceGroupName $ResourceGroupName -Disk $vmDisk -DiskName $vmDisk.Name
    }

    If ($stopVM)
    {
        Write-Output "Restart the VM as it was stopped from a Running State..."
        Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $VMName -AsJob > $null
    }

    Write-Output "OS Disk size change successful."

}
else {
    Write-Error "Cannot find VM'"
    return 
}