Powershell Script to create Snapshot from VM – One VM at a time
Greetings to all unbelievable students across globe . Allow me to present one of the the most useful script for production use . We need to create VM disks (OS+Data) snapshot for various reason . We all know how to create that one through portal or through PowerShell . But for that you need maintain multiple details like VM name , RG name , disk name etc . This script is a ultimate solution for snapshot creation . Beauty of this script is you dont have to mention VM name at the beginning . Script will prompt you for the input . Type the VM name , sit back and relax . Script will collect all required information from the VM name and will pass in the script when needed . You can run this script directly in production . It will not intaratpt anytghing unless there is any dependecy with VM snap .
Only limitation of this script is this script will work with only one VM at a single time . I will post a new script that will work with multiple VM in one script .
Few point to keep in mind :
- Please run Powershell ISE in admin mode and copy and paste this script in scripting environment .
- Make sure you have installed and imported AzureRM module.
- You should have access to fetch VM details in production . I am owner of my EA subscription .
clear
Write-Host "Hey Bro Greetings !!" -ForegroundColor Cyan
Start-Sleep -s 1
Write-Host "My Name is King's Automation System . Designed By Subhendu ." -ForegroundColor Cyan
Start-Sleep -s 1
Write-Host "So you want to create snapshot of disks of a VM ." -ForegroundColor Cyan
Start-Sleep -s 1
Write-Host "Don't Worry ! Can you please tell me the VM Name ." -ForegroundColor Cyan
Start-Sleep -s 1
Add-Type -AssemblyName Microsoft.VisualBasic
$User = [Microsoft.VisualBasic.Interaction]::InputBox('Please type VM name', 'Build By Subhendu V1', "Please Type VM name")
$king = '---------------------------------------------------------------------------------------'
Write-Host "Great !! So I will continue with "$user" vm" -ForegroundColor Yellow
#Just type the VM name over here . Version 1 . Build by Subhendu
$VMName = $User
$VMRGname = (Get-AzureRmResource -Name $VMName -ResourceType "Microsoft.Compute/virtualMachines").ResourceGroupName
$OSDisk = (Get-AzureRMVM –Name $VMName –ResourceGroupName $VMRGname).StorageProfile.OsDisk.Name
$DataDisk = (Get-AzureRMVM –Name $VMName –ResourceGroupName $VMRGname).StorageProfile.DataDisks.name
$i = 1
$king
ForEach($OSDisk in $OSDisk)
{
Write-Host "OSDisk No $i : $OSDisk"
Write-Host "Now I am creating snapshot of Disk $i " -ForegroundColor White
$Disk = Get-AzureRmDisk -ResourceGroupName $VMRGname -Name $OSDisk
$location = (Get-AzureRmResource -Name $OSDisk).Location
$day = (Get-Date).Day
$month = Get-Date -Format MMM
$year = (Get-Date).Year
$OSSnapshotName = ($VMName + '_' + $day + '_' + $month + '_' + $year + '_Snapshot_OS_Disk_' + $i)
$Snapshot = New-AzureRmSnapshotConfig -SourceUri $Disk.Id -CreateOption Copy -Location $location
New-AzureRmSnapshot -Snapshot $Snapshot -SnapshotName $OSSnapshotName -ResourceGroupName $VMRGname
Write-Host "Snapshot Name : $OSSnapshotName" -ForegroundColor Green
$i =$i+1
}
$king
$i = 1
ForEach($DataDisk in $DataDisk)
{
Write-Host "DataDisk No $i :$DataDisk"
Write-Host "Now I am creating snapshot of Disk $i " -ForegroundColor White
$Disk = Get-AzureRmDisk -ResourceGroupName $VMRGname -Name $DataDisk
$location = (Get-AzureRmResource -Name $DataDisk).Location
$day = (Get-Date).Day
$month = Get-Date -Format MMM
$year = (Get-Date).Year
$DataSnapshotName = ($VMName + '_' + $day + '_' + $month + '_' + $year + '_Snapshot_Data_Disk_' + $i)
$Snapshot = New-AzureRmSnapshotConfig -SourceUri $Disk.Id -CreateOption Copy -Location $location
New-AzureRmSnapshot -Snapshot $Snapshot -SnapshotName $DataSnapshotName -ResourceGroupName $VMRGname
Write-Host "Snapshot Name : $DataSnapshotName" -ForegroundColor Green
$i =$i+1
$king
}
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Congrats ! This task is successfully completed!",0, "Build By : Subhendu , Version : V1")