-
Notifications
You must be signed in to change notification settings - Fork 119
/
AzureRM - Reprovision existing VM into an Availability Set.ps1
148 lines (100 loc) · 3.47 KB
/
AzureRM - Reprovision existing VM into an Availability Set.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
# Sign-in to Azure via Azure Resource Manager
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 in which existing VM is provisioned
$rgName =
( Get-AzureRmResourceGroup |
Out-GridView `
-Title "Select existing Azure Resource Group ..." `
-PassThru
).ResourceGroupName
# Select VM to re-provision
$vmName =
( Get-AzureRmVm `
-ResourceGroupName $rgName
).Name |
Out-GridView `
-Title "Select a VM ..." `
-PassThru
$vm =
Get-AzureRmVm `
-ResourceGroupName $rgName `
-Name $vmName
$location =
$vm.Location
# Create a new Azure availability set
$asName =
Read-Host `
-Prompt "Enter a new Availability Set name"
$as =
New-AzureRmAvailabilitySet `
-Name $asName `
-ResourceGroupName $rgName `
-Location $location
# Stop and Deprovision existing Azure VM, retaining Disks
$vm | Stop-AzureRmVm -Force
$vm | Remove-AzureRmVm -Force
# Set VM config to include new Availability Set
$asRef = New-Object Microsoft.Azure.Management.Compute.Models.SubResource
$asRef.Id = $as.Id
$vm.AvailabilitySetReference = $asRef # To remove VM from Availability Set, set to $null
# Clean-up VM config to reflect deployment from attached disks
$vm.StorageProfile.OSDisk.Name = $vmName
$vm.StorageProfile.OSDisk.CreateOption = "Attach"
$vm.StorageProfile.DataDisks |
ForEach-Object { $_.CreateOption = "Attach" }
$vm.StorageProfile.ImageReference = $null
$vm.OSProfile = $null
# Re-provision VM from attached disks
$vm |
New-AzureRmVm `
-ResourceGroupName $rgName `
-Location $location
# If a second VM needs to be moved to same availability set, then use below
$vmName =
( Get-AzureRmVm `
-ResourceGroupName $rgName
).Name |
Out-GridView `
-Title "Select a VM ..." `
-PassThru
$vm =
Get-AzureRmVm `
-ResourceGroupName $rgName `
-Name $vmName
$location =
$vm.Location
$vm | Stop-AzureRmVm -Force
$vm | Remove-AzureRmVm -Force
$asRef = New-Object Microsoft.Azure.Management.Compute.Models.SubResource
$asRef.Id = $as.Id
$vm.AvailabilitySetReference = $asRef
$vm.StorageProfile.OSDisk.Name = $vmName
$vm.StorageProfile.OSDisk.CreateOption = "Attach"
$vm.StorageProfile.DataDisks |
ForEach-Object { $_.CreateOption = "Attach" }
$vm.StorageProfile.ImageReference = $null
$vm.OSProfile = $null
$vm |
New-AzureRmVm `
-ResourceGroupName $rgName `
-Location $location