-
Notifications
You must be signed in to change notification settings - Fork 119
/
AzureRM - Backup VM disks.ps1
141 lines (97 loc) · 2.89 KB
/
AzureRM - Backup VM disks.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
# Sign-in with Azure account credentials
Login-AzureRmAccount
# Select Azure Subscription
$subscriptionId =
(Get-AzureRmSubscription |
Out-GridView `
-Title "Select an Azure Subscription ..." `
-PassThru).SubscriptionId
Select-AzureRmSubscription `
-SubscriptionId $subscriptionId
# If needed, register ARM core resource providers
Register-AzureRmResourceProvider `
-ProviderNamespace Microsoft.Compute
Register-AzureRmResourceProvider `
-ProviderNamespace Microsoft.Storage
Register-AzureRmResourceProvider `
-ProviderNamespace Microsoft.Network
Get-AzureRmResourceProvider |
Select-Object `
-Property ProviderNamespace `
-ExpandProperty ResourceTypes
# Select Azure Resource Group
$rgName =
(Get-AzureRmResourceGroup |
Out-GridView `
-Title "Select an Azure Resource Group ..." `
-PassThru).ResourceGroupName
# Select an Azure VM from Resource Group
$vmName =
(Get-AzureRmVm `
-ResourceGroupName $rgName).Name |
Out-GridView `
-Title "Select an Azure VM ..." `
-PassThru
$vm =
Get-AzureRmVm `
-ResourceGroupName $rgName `
-Name $vmName
# Stop and Deallocate VM if running
$vmStatus =
(Get-AzureRmVm `
-ResourceGroupName $rgName `
-Name $vmName `
-Status).Statuses
if ($vmStatus[-1].Code -ne "PowerState/deallocated") {
$vm | Stop-AzureRmVm -Force
}
# Identify VM disks
$vmDisks = @()
$vmDisks +=
$vm.StorageProfile.OSDisk.VirtualHardDisk.Uri
Foreach ($vmDisk in $vm.StorageProfile.DataDisks) {
$vmDisks +=
$vmDisk.VirtualHardDisk.Uri
}
# Define Context for Storage Account
$storageAccountName =
$vmDisks[0].Substring(8).Split('.')[0]
$storageContext =
(Get-AzureRmStorageAccount `
-ResourceGroupName $rgName `
-Name $storageAccountName).Context
# Create "backups" container in Storage Account
$destContainer =
"backups-" +
(Get-Date -Format o).Replace(":","-").Replace(".","-").ToLower()
New-AzureStorageContainer `
-Name $destContainer `
-Context $storageContext
# Create backup copy of each VM disk to backup container
ForEach ($vmDisk in $vmDisks) {
$srcContainer =
$vmDisk.Split('/')[3]
$srcBlob =
$vmDisk.Split('/')[4]
Start-AzureStorageBlobCopy `
-Context $storageContext `
-SrcContainer $srcContainer `
-SrcBlob $srcBlob `
-DestContainer $destContainer
}
# Wait for copy to complete for each disk
ForEach ($vmDisk in $vmDisks) {
$srcContainer =
$vmDisk.Split('/')[3]
$srcBlob =
$vmDisk.Split('/')[4]
Get-AzureStorageBlobCopyState `
-Context $storageContext `
-Container $destContainer `
-Blob $srcBlob `
-WaitForComplete
}
# Start VM if it was previously not de-allocated
if ($vmStatus[-1].Code -ne "PowerState/deallocated") {
$vm | Start-AzureRmVm
}