From dc6b02a95ae5f1f3ee7d53d6f7747682190e5345 Mon Sep 17 00:00:00 2001 From: William Lam Date: Tue, 21 Nov 2017 07:39:22 -0800 Subject: [PATCH 1/3] Export/Import functions for manual vCenter Server Migrations --- Modules/vCenterManualMigration.psm1 | 475 ++++++++++++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 Modules/vCenterManualMigration.psm1 diff --git a/Modules/vCenterManualMigration.psm1 b/Modules/vCenterManualMigration.psm1 new file mode 100644 index 0000000..a7750b9 --- /dev/null +++ b/Modules/vCenterManualMigration.psm1 @@ -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 + } + } +} \ No newline at end of file From cdfd510dd9cfb7e61f3cf23f7fc13e3fbfd55585 Mon Sep 17 00:00:00 2001 From: William Lam Date: Tue, 21 Nov 2017 09:37:27 -0800 Subject: [PATCH 2/3] Whoops, missed folder for module --- Modules/vCenterManualMigration.psm1 | 475 ---------------------------- 1 file changed, 475 deletions(-) delete mode 100644 Modules/vCenterManualMigration.psm1 diff --git a/Modules/vCenterManualMigration.psm1 b/Modules/vCenterManualMigration.psm1 deleted file mode 100644 index a7750b9..0000000 --- a/Modules/vCenterManualMigration.psm1 +++ /dev/null @@ -1,475 +0,0 @@ -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 - } - } -} \ No newline at end of file From d104a293934819d792ce2ab1af449c5af51ce236 Mon Sep 17 00:00:00 2001 From: William Lam Date: Tue, 21 Nov 2017 09:38:24 -0800 Subject: [PATCH 3/3] Might be useful if I actually added directory --- .../vCenterManualMigration.psm1 | 475 ++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 Modules/vCenterManualMigration/vCenterManualMigration.psm1 diff --git a/Modules/vCenterManualMigration/vCenterManualMigration.psm1 b/Modules/vCenterManualMigration/vCenterManualMigration.psm1 new file mode 100644 index 0000000..a7750b9 --- /dev/null +++ b/Modules/vCenterManualMigration/vCenterManualMigration.psm1 @@ -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 + } + } +} \ No newline at end of file