Merge pull request #145 from lamw/master
Export/Import functions for manual vCenter Server Migrations
This commit is contained in:
475
Modules/vCenterManualMigration/vCenterManualMigration.psm1
Normal file
475
Modules/vCenterManualMigration/vCenterManualMigration.psm1
Normal file
@@ -0,0 +1,475 @@
|
||||
Function Export-DRSRules {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Export DRS Rules to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Export DRS Rules to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Export-DRSRules -Path C:\Users\primp\Desktop\VMworld2017 -Cluster Windows-Cluster
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path,
|
||||
[Parameter(Mandatory=$true)][String]$Cluster
|
||||
)
|
||||
|
||||
$rules = Get-Cluster -Name $Cluster | Get-DrsRule
|
||||
|
||||
$results = @()
|
||||
foreach ($rule in $rules) {
|
||||
$vmNames = @()
|
||||
$vmIds = $rule.VMIds
|
||||
|
||||
# Reconstruct MoRef ID to VM Object to get Name
|
||||
foreach ($vmId in $vmIds) {
|
||||
$vm = New-Object VMware.Vim.ManagedObjectReference
|
||||
$vm.Type = "VirtualMachine"
|
||||
$vm.Value = ($vmId -replace "VirtualMachine-","")
|
||||
$vmView = Get-View $vm
|
||||
$vmNames += $vmView.name
|
||||
}
|
||||
|
||||
$rulesObject = [pscustomobject] @{
|
||||
Name = $rule.ExtensionData.Name;
|
||||
Type = $rule.Type; #VMAffinity = 1, VMAntiAffinity = 0
|
||||
Enabled = $rule.Enabled;
|
||||
Mandatory = $rule.ExtensionData.Mandatory
|
||||
VM = $vmNames
|
||||
}
|
||||
$results+=$rulesObject
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\DRSRules.json"
|
||||
Write-Host -ForegroundColor Green "Exporting DRS Rules to $fullpath ..."
|
||||
$results | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$results | ConvertTo-Json
|
||||
}
|
||||
}
|
||||
|
||||
Function Import-DRSRules {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Import DRS Rules from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Import DRS Rules from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Import-DRSRules -Path C:\Users\primp\Desktop\VMworld2017 -Cluster Windows-Cluster
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][String]$Path,
|
||||
[Parameter(Mandatory=$true)][String]$Cluster
|
||||
)
|
||||
|
||||
Get-DrsRule -Cluster $cluster | Remove-DrsRule -Confirm:$false | Out-Null
|
||||
|
||||
$DRSRulesFilename = "/DRSRules.json"
|
||||
$fullPath = $Path + $DRSRulesFilename
|
||||
$json = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
foreach ($line in $json) {
|
||||
$vmArr = @()
|
||||
$vmNames = $line.vm
|
||||
foreach ($vmName in $vmNames) {
|
||||
$vmView = Get-VM -Name $vmName
|
||||
$vmArr+=$vmView
|
||||
}
|
||||
New-DrsRule -Name $line.name -Enabled $line.Enabled -Cluster (Get-Cluster -Name $Cluster) -KeepTogether $line.Type -VM $vmArr
|
||||
}
|
||||
}
|
||||
|
||||
Function Export-DRSClusterGroup {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Export DRS Cluster Group Rules to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Export DRS Cluster Group Rules to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Export-DRSClusterGroup -Path C:\Users\primp\Desktop\VMworld2017 -Cluster Windows-Cluster
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path,
|
||||
[Parameter(Mandatory=$true)][String]$Cluster
|
||||
)
|
||||
|
||||
$rules = Get-Cluster -Name $Cluster | Get-DrsClusterGroup
|
||||
|
||||
$results = @()
|
||||
foreach ($rule in $rules) {
|
||||
$rulesObject = [pscustomobject] @{
|
||||
Name = $rule.ExtensionData.Name;
|
||||
Type = $rule.GroupType; #VMType = 1, HostType = 0
|
||||
Member = $rule.Member
|
||||
}
|
||||
$results+=$rulesObject
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\DRSClusterGroupRules.json"
|
||||
Write-Host -ForegroundColor Green "Exporting DRS Cluster Group Rules to $fullpath ..."
|
||||
$results | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$results | ConvertTo-Json
|
||||
}
|
||||
}
|
||||
|
||||
Function Import-DRSClusterClusterGroup {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Import DRS Cluster Group Rules from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Import DRS Cluster Group Rules from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Import-DRSClusterClusterGroup -Path C:\Users\primp\Desktop\VMworld2017 -Cluster Windows-Cluster
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][String]$Path,
|
||||
[Parameter(Mandatory=$true)][String]$Cluster
|
||||
)
|
||||
|
||||
$DRSClusterGroupRulesFilename = "\DRSClusterGroupRules.json"
|
||||
$fullPath = $Path + $DRSClusterGroupRulesFilename
|
||||
$json = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
foreach ($line in $json) {
|
||||
$memberArr = @()
|
||||
$members = $line.member
|
||||
|
||||
# VMHost Group
|
||||
if($line.Type -eq 0) {
|
||||
foreach ($member in $members) {
|
||||
$memberView = Get-VMhost -Name $member
|
||||
$memberArr+=$memberView
|
||||
}
|
||||
New-DrsClusterGroup -Name $line.name -Cluster (Get-Cluster -Name $Cluster) -VMhost $memberArr
|
||||
# VM Group
|
||||
} else {
|
||||
foreach ($member in $members) {
|
||||
$memberView = Get-VM -Name $member
|
||||
$memberArr+=$memberView
|
||||
}
|
||||
New-DrsClusterGroup -Name $line.name -Cluster (Get-Cluster -Name $Cluster) -VM $memberArr
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Function Export-Tag {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Export vSphere Tags and VM Assocations to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Export vSphere Tags and VM Assocations to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Export-Tag -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path
|
||||
)
|
||||
|
||||
# Export Tag Categories
|
||||
$tagCatagorys = Get-TagCategory
|
||||
|
||||
$tagCatresults = @()
|
||||
foreach ($tagCategory in $tagCatagorys) {
|
||||
$tagCatObj = [pscustomobject] @{
|
||||
Name = $tagCategory.Name;
|
||||
Cardinality = $tagCategory.Cardinality;
|
||||
Description = $tagCategory.Description;
|
||||
Type = $tagCategory.EntityType
|
||||
}
|
||||
$tagCatresults+=$tagCatObj
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\AllTagCategory.json"
|
||||
Write-Host -ForegroundColor Green "Exporting vSphere Tag Category to $fullpath ..."
|
||||
$tagCatresults | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$tagCatresults | ConvertTo-Json
|
||||
}
|
||||
|
||||
# Export Tags
|
||||
$tags = Get-Tag
|
||||
|
||||
$tagResults = @()
|
||||
foreach ($tag in $tags) {
|
||||
$tagObj = [pscustomobject] @{
|
||||
Name = $tag.Name;
|
||||
Description = $tag.Description;
|
||||
Category = $tag.Category.Name
|
||||
}
|
||||
$tagResults+=$tagObj
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\AllTag.json"
|
||||
Write-Host -ForegroundColor Green "Exporting vSphere Tag to $fullpath ..."
|
||||
$tagResults | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$tagResults | ConvertTo-Json
|
||||
}
|
||||
|
||||
# Export VM to Tag Mappings
|
||||
$vms = Get-VM
|
||||
|
||||
$vmResults = @()
|
||||
foreach ($vm in $vms) {
|
||||
$tagAssignments = $vm | Get-TagAssignment
|
||||
$tags = @()
|
||||
foreach ($tagAssignment in $tagAssignments) {
|
||||
$tag = $tagAssignment.Tag
|
||||
$tagName = $tag -split "/"
|
||||
$tags+=$tagName
|
||||
}
|
||||
$vmObj = [pscustomobject] @{
|
||||
Name = $vm.name;
|
||||
Tag = $tags
|
||||
}
|
||||
$vmResults+=$vmObj
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\AllTagAssocations.json"
|
||||
Write-Host -ForegroundColor Green "Exporting VM to vSphere Tag Assignment to $fullpath ..."
|
||||
$vmResults | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$vmResults | ConvertTo-Json
|
||||
}
|
||||
}
|
||||
|
||||
Function Import-Tag {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Import vSphere Tags and VM Assocations from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Import vSphere Tags and VM Assocations from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Import-Tag -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][String]$Path
|
||||
)
|
||||
|
||||
$tagCatFilename = "\AllTagCategory.json"
|
||||
$fullPath = $Path + $tagCatFilename
|
||||
$tagCategoryJson = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
$tagFilename = "\AllTag.json"
|
||||
$fullPath = $Path + $tagFilename
|
||||
$tagJson = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
$vmTagFilename = "\AllTagAssocations.json"
|
||||
$fullPath = $Path + $vmTagFilename
|
||||
$vmTagJson = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
# Re-Create Tag Category
|
||||
foreach ($category in $tagCategoryJson) {
|
||||
if($category.Cardinality -eq 0) {
|
||||
$cardinality = "Single"
|
||||
} else {
|
||||
$cardinality = "Multiple"
|
||||
}
|
||||
New-TagCategory -Name $category.Name -Cardinality $cardinality -Description $category.Description -EntityType $category.Type
|
||||
}
|
||||
|
||||
# Re-Create Tags
|
||||
foreach ($tag in $tagJson) {
|
||||
New-Tag -Name $tag.Name -Description $tag.Description -Category (Get-TagCategory -Name $tag.Category)
|
||||
}
|
||||
|
||||
# Re-Create VM to Tag Mappings
|
||||
foreach ($vmTag in $vmTagJson) {
|
||||
$vm = Get-VM -Name $vmTag.name
|
||||
$tags = $vmTag.Tag
|
||||
foreach ($tag in $tags) {
|
||||
New-TagAssignment -Entity $vm -Tag (Get-Tag -Name $tag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Function Export-VMFolder {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Export vSphere Folder to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Export vSphere Folder to JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Export-VMFolder -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path
|
||||
)
|
||||
$vms = Get-VM
|
||||
|
||||
$vmFolderResults = @()
|
||||
foreach ($vm in $vms) {
|
||||
$vmFolderObj = [pscustomobject] @{
|
||||
Name = $vm.name;
|
||||
Folder = $vm.Folder.Name;
|
||||
}
|
||||
$vmFolderResults+=$vmFolderObj
|
||||
}
|
||||
if($Path) {
|
||||
$fullPath = $Path + "\AllVMFolder.json"
|
||||
Write-Host -ForegroundColor Green "Exporting VM Folders to $fullpath ..."
|
||||
$vmFolderResults | ConvertTo-Json | Out-File $fullPath
|
||||
} else {
|
||||
$vmFolderResults | ConvertTo-Json
|
||||
}
|
||||
}
|
||||
|
||||
Function Import-VMFolder {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Import vSphere Folder from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.DESCRIPTION
|
||||
Import vSphere Folder from JSON file based on VMworld Demo https://youtu.be/MagjfbIL4kg
|
||||
.EXAMPLE
|
||||
Import-VMFolder -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$true)][String]$Path
|
||||
)
|
||||
|
||||
$vmFolderFilename = "\AllVMFolder.json"
|
||||
$fullPath = $Path + $vmFolderFilename
|
||||
$vmFolderJson = Get-Content -Raw $fullPath | ConvertFrom-Json
|
||||
|
||||
# Root vm Folder
|
||||
$rootVMFolder = Get-Folder -Type VM -Name vm
|
||||
|
||||
$folders = $vmFolderJson | Select Folder | Sort-Object -Property Folder -Unique
|
||||
foreach ($folder in $folders) {
|
||||
$rootVMFolder | New-Folder -Name $folder.folder
|
||||
}
|
||||
|
||||
foreach ($vmFolder in $vmFolderJson) {
|
||||
$vm = Get-VM -Name $vmFolder.Name
|
||||
$folder = Get-Folder -Name $vmFolder.Folder
|
||||
Move-VM -VM $vm -Destination $folder
|
||||
}
|
||||
}
|
||||
|
||||
Function Export-VMStoragePolicy {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Export VM Storage Policies to JSON file
|
||||
.DESCRIPTION
|
||||
Export VM Storage Policies to JSON file
|
||||
.EXAMPLE
|
||||
Export-VMStoragePolicy -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path
|
||||
)
|
||||
|
||||
foreach ($policy in Get-SpbmStoragePolicy) {
|
||||
$policyName = $policy.Name
|
||||
if($Path) {
|
||||
Write-Host -ForegroundColor Green "Exporting Policy $policyName to $Path\$policyName.xml ..."
|
||||
$policy | Export-SpbmStoragePolicy -FilePath $Path\$policyName.xml -Force | Out-Null
|
||||
} else {
|
||||
$policy
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Function Import-VMStoragePolicy {
|
||||
<#
|
||||
.NOTES
|
||||
===========================================================================
|
||||
Created by: William Lam
|
||||
Date: 11/21/2017
|
||||
Blog: https://www.virtuallyghetto.com
|
||||
Twitter: @lamw
|
||||
===========================================================================
|
||||
|
||||
.SYNOPSIS
|
||||
Import VM Storage Policies from JSON file
|
||||
.DESCRIPTION
|
||||
Import VM Storage Policies from JSON file
|
||||
.EXAMPLE
|
||||
Import-VMStoragePolicy -Path C:\Users\primp\Desktop\VMworld2017
|
||||
#>
|
||||
param(
|
||||
[Parameter(Mandatory=$false)][String]$Path
|
||||
)
|
||||
|
||||
foreach ($file in Get-ChildItem -Path $Path -Filter *.xml) {
|
||||
$policyName = $file.name
|
||||
$policyName = $policyName.replace(".xml","")
|
||||
if(Get-SpbmStoragePolicy -Name $policyName -ErrorAction SilentlyContinue) {
|
||||
Continue
|
||||
} else {
|
||||
Write-Host "Importing Policy $policyname ..."
|
||||
Import-SpbmStoragePolicy -FilePath $Path\$file -Name $policyName
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user