-
Notifications
You must be signed in to change notification settings - Fork 23
/
Copy pathVMSnap.ps1
181 lines (171 loc) · 8.36 KB
/
VMSnap.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
Param(
[Parameter(Mandatory=$true,HelpMessage="The VM Name in the current Azure subscription")]
[ValidateScript({Get-AZVM -Name ($_)})]
[string] $VMName,
[Parameter(Mandatory=$true,HelpMessage="Short name for the Snapshot.")]
[string] $Snapname,
[switch] $Backup,
[switch] $Restore
)
Function Msgbox($caption,$message,$type,$MaxSize){
if ($MaxSize -eq $null) { $MaxSize = 125}
$sCaption = $caption.Length
$sMessage = $Message.Length
If (($sCaption + $sMessage) -ge $MaxSize) {
$MaxSize = ($sCaption + $sMessage) + 20
}
$vDynamicSpace = $MaxSize - ($sCaption + $sMessage)
$vDynamicSpace = " " * $vDynamicSpace
Write-Host $caption $message $vDynamicSpace " [" -NoNewline
if ($type -eq '0') {
Write-Host -ForegroundColor Green " OK " -NoNewline
}Elseif ($type -eq '1'){
Write-Host -ForegroundColor Yellow " WARNING " -NoNewline
}Else{
Write-Host -ForegroundColor Red " ERROR " -NoNewline
}
Write-Host "]"
}
Function VMShortName($objName){
Return $objName.Split(".")[0]
}
Function VMInventory($VMName){
$info = "" | Select Name, ResourceGroupName, Location, VMSize, OSDisk, DataDisk, SnapName, TotalDataDisks
$vm = Get-AzVM -Name $VMName
$info.Name = $vm.Name
$info.ResourceGroupName = $vm.ResourceGroupName
$info.Location = $vm.Location
$info.VMSize = $vm.HardwareProfile.VmSize
$info.OSDisk = $vm.StorageProfile.OsDisk
$info.DataDisk = $vm.StorageProfile.DataDisks
$info.TotalDataDisks = ($vm.StorageProfile.DataDisks).count
$info.Snapname = $vSnapName
#Making sure all disks attached to the VM are on the same version
$vStatus = $False
If (!($info.OSDisk.Name -like $vSnapName)) {$vStatus=$true}
ForEach ($disk in $info.DataDisk) {
If (!($disk.Name -like $vSnapName)) {$vStatus=$true; $vcount++}
}
if (!(Get-AzDisk | where-object { $_.Name -like $vSnapName })) {
$vStatus = $true
}
If ($vstatus -eq $true) {
Return $info
}Else{
Return $vstatus
}
}
Function VMSnapshot($vmInfo){
#Creating a new snapshot
$vm_OSDisk = Get-AzDisk -ResourceGroupName $vmInfo.ResourceGroupName -DiskName $vmInfo.OSDisk.Name
$vm_OSSnapConfig = New-AzSnapshotConfig -SourceUri $vm_OSDisk.Id -CreateOption Copy -Location $vmInfo.location
$tNewName = (VMShortName $vminfo.OsDisk.name) + ".snap" + $vminfo.SnapName
$vm_OSDiskSnap = New-AzSnapshot -SnapshotName $tNewName -Snapshot $vm_OSSnapConfig -ResourceGroupName $vmInfo.ResourceGroupName
If ($vm_OSDiskSnap.ProvisioningState -eq 'Succeeded'){
Msgbox "VMSnapshot (OS):" ("Creation for OSDisk " + $tNewName + " was successful.") 0 125
}Else{
Msgbox "VMSnapshot (OS)" ("Creation for OSDisk " + $tNewName+ " failed.") 2 125
}
#Creating the Data Disk(s) Snapshot(s)
ForEach($disk in $vmInfo.DataDisk){
#Validating if there is no snapshot and then creating a new one
$vm_DataDisk = Get-AzDisk -ResourceGroupName $vmInfo.ResourceGroupName -DiskName $disk.name
$vm_DataDiskSnapConfig = New-AzSnapshotConfig -SourceUri $vm_DataDisk.Id -CreateOption Copy -Location $vmInfo.location
$tNewName = (VMShortName $Disk.name) + ".snap" + $vminfo.SnapName
$vm_DataDiskSnap = New-AzSnapshot -SnapshotName $tNewName -Snapshot $vm_DataDiskSnapConfig -ResourceGroupName $vmInfo.ResourceGroupName
If ($vm_DataDiskSnap.ProvisioningState -eq 'Succeeded'){
Msgbox "VMSnapshot (Data):" ("Creation of " + $tNewName + " was successful.") 0 125
}Else{
Msgbox "VMSnapshot (Data):" ("Creation of " + $tNewName + " failed.") 2 125
}
}
#Saving as JSON
$vmInfo | convertto-json | out-file ($vmInfo.Name + $vmInfo.Snapname + ".json")
Msgbox "VMSnapshot:" ("Creation of " + $vmInfo.Name + $vmInfo.Snapname + ".json") 0 125
}
Function RestoreSnap($vminfo){
#OS Disk
$tDiskType = (Get-AzDisk -DiskName $vminfo.OsDisk.name).sku.name
#changes
$tSnapShotNewName = (VMShortName $vminfo.OsDisk.name) + ".snap" + $vminfo.SnapName
$tSnapShot = Get-AZSnapshot -SnapshotName $tSnapShotNewName
#$tSnapShot = Get-AZSnapshot -SnapshotName ($vminfo.OsDisk.name + ".snap" + $vminfo.SnapName)
$tDiskConfig = New-AzDiskConfig -SkuName $tDiskType -Location $vmInfo.location -CreateOption Copy -SourceResourceId $tsnapshot.Id
$tNewName = (VMShortName $vminfo.OsDisk.name) + $vmInfo.SnapName #Name change
$temp = New-AzDisk -Disk $tDiskConfig -ResourceGroupName $vmInfo.ResourceGroupName -DiskName $tNewName
If ($temp.ProvisioningState -eq "Succeeded") {
Msgbox "RestoreSnap (OS):" ("New Disk " + $tnewName + " was created.") 0 125
} Else {Msgbox "RestoreSnap (OS):" ("New Disk " + $tnewName + " creation failed") 2 125}
$tNewName = $null
$tSnapShotNewName = $null
#Data Disk(s)
ForEach($disk in $vmInfo.DataDisk){
$tDiskType=$null
$tSnapshot =$null
$tDiskConfig=$null
$tNewName=$null
$tDiskType = (Get-AzDisk -DiskName $disk.name).sku.name
#changes
$tSnapShotNewName = (VMShortName $Disk.name) + ".snap" + $vminfo.SnapName
$tSnapShot = Get-AZSnapshot -SnapshotName $tSnapShotNewName
#$tSnapShot = Get-AZSnapshot -SnapshotName ($vminfo.OsDisk.name + ".snap" + $vminfo.SnapName)
$tDiskConfig = New-AzDiskConfig -SkuName $tDiskType -Location $vmInfo.location -CreateOption Copy -SourceResourceId $tsnapshot.Id
$tNewName = (VMShortName $Disk.name) + $vmInfo.SnapName #name change
If ($tnewName -ne $False) {
$temp = New-AzDisk -Disk $tDiskConfig -ResourceGroupName $vmInfo.ResourceGroupName -DiskName $tNewName
If ($temp.ProvisioningState -eq "Succeeded") {
Msgbox "RestoreSnap (Data):" ("New Disk " + $tnewName + " was created.") 0 125
} Else {Msgbox "RestoreSnap (Data):" ("New Disk " + $tnewName + " creation failed") 2 125}
} else {
Msgbox "RestoreSnap (Data): " ("Name couldnt be found " + $tNewName) 2 125
}
$tNewName = $null
$tSnapShotNewName = $null
}
}
Function VMRestore($vmInfo){
#OS Disk
$tNewOSDiskName = (VMShortName $vminfo.OsDisk.name) + $vmInfo.SnapName #name change
$tVM = Get-AzVM -Name $vminfo.Name
$New_OSDisk = Get-AzDisk -Name $tNewOSDiskName -ResourceGroupName $vmInfo.ResourceGroupName
$temp = Set-AzVMOSDisk -VM $tVM -ManagedDiskId $New_OSDisk.Id -Name $New_OSDisk.Name
$temp = Update-AzVM -VM $tVM -ResourceGroupName $vmInfo.ResourceGroupName
If ($temp.StatusCode -eq "OK") {
Msgbox "Swap Disk (OS):" ("The OS Disk " + $New_OSDisk.Name + " was swapped successful.") 0 125
} Else {
Msgbox "Swap Disk (OS):" ("The OS Disk " + $New_OSDisk.Name + " failed during the swap process. Manual investigation required.") 2 125
}
ForEach($disk in ($vmInfo.DataDisk)){
#removing the disk
$temp = Remove-AZVMDataDisk -VM $tVM -Name $disk.Name
$temp = Update-AzVM -VM $tVM -ResourceGroupName $vminfo.ResourceGroupName
#adding the new disk
$tNewDataDiskName = (VMShortName $Disk.name) + $vmInfo.SnapName #name change
$tDiskID = Get-AZDisk -diskname $tNewDataDiskName
$temp = Add-AzVMDataDisk -CreateOption Attach -Lun $disk.Lun -VM $tVM -ManagedDiskId $tDiskID.ID -Caching $disk.caching
$temp = Update-AzVM -VM $tVM -ResourceGroupName $vmInfo.ResourceGroupName
If ($temp.StatusCode -eq "OK") {
Msgbox "Swap Disk(s) (Data):" ("The Data Disk " + $Disk.Name + " was swapped by " + $tNewDataDiskName + " successful.") 0 125
} Else {
Msgbox "Swap Disk(s) (Data):" ("The Data Disk " + $Disk.Name + " failed during the swap process. Manual investigation required.") 0 125
}
}
}
#Body Script
If (($PSBoundParameters.Keys.Contains("backup")) -and ($PSBoundParameters.Keys.Contains("restore"))) {
Msgbox "INPUT ERROR:" "You need to select either Backup or Restore switch." 2 125
break
}
Write-Host
Write-Host -ForegroundColor Yellow "Working on Virtual Machine...: " $VMName
Write-Host -ForegroundColor Yellow "Creating the snapshot........:" $Snapname
Write-Host
$global:vSnapName = "." + $Snapname
$CurrentVM = VMInventory $VMName
If ($PSBoundParameters.Keys.Contains("backup")) {
VMSnapshot $CurrentVM
}
If ($PSBoundParameters.Keys.Contains("restore")) {
RestoreSnap $CurrentVM
VMRestore $CurrentVM
}