Je vous présente aujourd’hui un script que j’ai développé avec l’aide de ceux proposés par LucD, il permet de faire la migration depuis un ancien vCenter vers un nouveau « from scratch », dans mon cas depuis un vCSA 5.5 vers une architecture avec deux vCSA 6.0 avec PSC externe en Linked Mode.
Etant donné que je n’ai pas trouvé de solution (Pour l’instant :D) pour migrer les Utilisateurs & Groupes SSO, ils devront donc être ajoutés à la main…
Prérequis :
- Ajouter le vCenter au domaine
- Ajouter les Utilisateur & Groupes SSO (Manuel pour l’instant)
- Attacher les ESXi au vCenter
Pour le reste le script s’occupe de tout, il va recréer les différents Roles avec les bon Privilèges, créer les différents Folders et y insérer les VM puis ajouter les Permissions. Je conseille d’ouvrir un nouveau PowerCLI pour partir propre sans liaison à d’autres vCenter.
[pastacode lang= »bash » manual= »function%20ConnectServer(%5Bstring%5D%20%24strVCenterName)%20%7B%0A%20%20%20%20Connect-VIServer%20-Server%20%24strVCenterName%20-User%20%24strVcenterUser%20-Password%20%24strVcenterPass%20-SaveCredentials%0A%7D%0A%20%0Afunction%20ExportFolder(%5Bstring%5D%20%24dcName)%7B%0ANew-VIProperty%20-Name%20’BlueFolderPath’%20-ObjectType%20’VirtualMachine’%20-Value%20%7B%0A%20%20%20%20param(%24vm)%0A%0A%20%20%20%20function%20Get-ParentName%7B%0A%20%20%20%20%20%20%20%20param(%24object)%0A%0A%20%20%20%20%20%20%20%20if(%24object.Folder)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24blue%20%3D%20Get-ParentName%20%24object.Folder%0A%20%20%20%20%20%20%20%20%20%20%20%20%24name%20%3D%20%24object.Folder.Name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20elseif(%24object.Parent%20-and%20%24object.Parent.GetType().Name%20-like%20%22Folder*%22)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24blue%20%3D%20Get-ParentName%20%24object.Parent%0A%20%20%20%20%20%20%20%20%20%20%20%20%24name%20%3D%20%24object.Parent.Name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20elseif(%24object.ParentFolder)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24blue%20%3D%20Get-ParentName%20%24object.ParentFolder%0A%20%20%20%20%20%20%20%20%20%20%20%20%24name%20%3D%20%24object.ParentFolder.Name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20if(%22vm%22%2C%22Datacenters%22%20-notcontains%20%24name)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24blue%20%2B%20%22%2F%22%20%2B%20%24name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24blue%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%0A%20%20%20%20(Get-ParentName%20%24vm).Remove(0%2C1)%0A%7D%20-Force%20%7C%20Out-Null%20%0A%0AGet-VM%20-Location%20(Get-Datacenter%20-Name%20%24dcName)%20%7C%20%0ASelect%20Name%2CBlueFolderPath%20%7C%0AExport-Csv%20%24CSVPath%20-NoTypeInformation%20-UseCulture%20%0A%7D%0A%0Afunction%20ImportFolder(%5Bstring%5D%20%24newDatacenter)%7B%0A%24startFolder%20%3D%20Get-Folder%20-Name%20vm%20-Location%20(Get-Datacenter%20-Name%20%24newDatacenter)%0A%0AImport-Csv%20%24CSVPath%20-UseCulture%20%7C%20%25%7B%0A%20%20%20%20%24location%20%3D%20%24startFolder%0A%20%20%20%20%24_.BlueFolderPath.TrimStart(‘%2F’).Split(‘%2F’)%20%7C%20%25%7B%0A%20%20%20%20%20%20%20%20%24tgtFolder%20%3D%20Get-Folder%20-Name%20%24_%20-Location%20%24location%20-ErrorAction%20SilentlyContinue%0A%20%20%20%20%20%20%20%20if(!%24tgtFolder)%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24location%20%3D%20New-Folder%20-Name%20%24_%20-Location%20%24location%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20else%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24location%20%3D%20%24tgtFolder%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20%0A%20%20%20%20%24vm%20%3D%20Get-VM%20-Name%20%24_.Name%20-ErrorAction%20SilentlyContinue%0A%20%20%20%20if(%24vm)%7B%0A%20%20%20%20%20%20%20%20Move-VM%20-VM%20%24vm%20-Destination%20%24location%20-Confirm%3A%24false%20%0A%20%20%20%20%7D%0A%7D%0A%7D%0A%0Afunction%20ExportSSO(%5Bstring%5D%20%24XMLfile)%7B%0A%23%20Root%20of%20the%20XML%20file%0A%24global%3AvInventory%20%3D%20%5Bxml%5D%22%3CInventory%3E%3C%2FInventory%3E%22%0A%0A%23%20Functions%0Afunction%20New-XmlNode%7B%0A%09param(%24node%2C%20%24nodeName)%0A%0A%09%24tmp%20%3D%20%24global%3AvInventory.CreateElement(%24nodeName)%0A%09%24node.AppendChild(%24tmp)%0A%7D%0A%0Afunction%20Set-XmlAttribute%7B%0A%09param(%24node%2C%20%24name%2C%20%24value)%0A%0A%09%24node.SetAttribute(%24name%2C%20%24value)%0A%7D%0Afunction%20Get-XmlNode%7B%0A%09param%20(%24path)%0A%09%24global%3AvInventory.SelectNodes(%24path)%0A%7D%0A%0Afunction%20Get-Roles%7B%0A%20%20begin%7B%0A%20%20%20%20%24authMgr%20%3D%20Get-View%20AuthorizationManager%0A%20%20%20%20%24report%20%3D%20%40()%0A%20%20%7D%0A%20%20process%7B%0A%20%20%20%20foreach(%24role%20in%20%24authMgr.roleList)%7B%0A%20%20%20%20%20%20%24ret%20%3D%20New-Object%20PSObject%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Name%22%20-Value%20%24role.name%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Label%22%20-Value%20%24role.info.label%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Summary%22%20-Value%20%24role.info.summary%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22RoleId%22%20-Value%20%24role.roleId%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22System%22%20-Value%20%24role.system%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Privilege%22%20-Value%20%24role.privilege%0A%20%20%20%20%20%20%24report%20%2B%3D%20%24ret%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20end%7B%0A%20%20%20%20return%20%24report%0A%20%20%7D%0A%7D%0Afunction%20Get-Permissions%0A%7B%0A%20%20begin%7B%0A%20%20%20%20%24report%20%3D%20%40()%0A%20%20%20%20%24authMgr%20%3D%20Get-View%20AuthorizationManager%0A%20%20%20%20%24roleHash%20%3D%20%40%7B%7D%0A%20%20%20%20%24authMgr.RoleList%20%7C%20%25%7B%0A%20%20%20%20%20%20%24roleHash%5B%24_.RoleId%5D%20%3D%20%24_.Name%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20process%7B%0A%20%20%20%20%24perms%20%3D%20%24authMgr.RetrieveAllPermissions()%0A%20%20%20%20foreach(%24perm%20in%20%24perms)%7B%0A%20%20%20%20%20%20%24ret%20%3D%20New-Object%20PSObject%0A%20%20%20%20%20%20%24entity%20%3D%20Get-View%20%24perm.Entity%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Entity%22%20-Value%20%24entity.Name%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22EntityType%22%20-Value%20%24entity.gettype().Name%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Group%22%20-Value%20%24perm.Group%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Principal%22%20-Value%20%24perm.Principal%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Propagate%22%20-Value%20%24perm.Propagate%0A%20%20%20%20%20%20%24ret%20%7C%20Add-Member%20-Type%20noteproperty%20-Name%20%22Role%22%20-Value%20%24roleHash%5B%24perm.RoleId%5D%0A%20%20%20%20%20%20%24report%20%2B%3D%20%24ret%0A%20%20%20%20%7D%0A%20%20%7D%0A%20%20end%7B%0A%20%20%20%20return%20%24report%0A%20%20%7D%0A%7D%0A%24global%3AvInventory%20%3D%20%5Bxml%5D%22%3CInventory%3E%3CRoles%2F%3E%3CPermissions%2F%3E%3C%2FInventory%3E%22%0A%0A%23%20Main%0A%23%20Roles%0A%20%20%24XMLRoles%20%3D%20Get-XmlNode%20%22Inventory%2FRoles%22%0AGet-Roles%20%7C%20where%20%7B-not%20%24_.System%7D%20%7C%20%25%20%7B%0A%20%20%24XMLRole%20%3D%20New-XmlNode%20%24XMLRoles%20%22Role%22%0A%20%20Set-XmlAttribute%20%24XMLRole%20%22Name%22%20%24_.Name%0A%20%20Set-XmlAttribute%20%24XMLRole%20%22Label%22%20%24_.Label%0A%20%20Set-XmlAttribute%20%24XMLRole%20%22Summary%22%20%24_.Summary%0A%20%20%24_.Privilege%20%7C%20%25%20%7B%0A%20%20%20%20%24XMLPrivilege%20%3D%20New-XmlNode%20%24XMLRole%20%22Privilege%22%0A%20%20%20%20Set-XmlAttribute%20%24XMLPrivilege%20%22Name%22%20%24_%0A%20%20%7D%0A%7D%0A%0A%23%20Permissions%0A%24XMLPermissions%20%3D%20Get-XmlNode%20%22Inventory%2FPermissions%22%0AGet-Permissions%20%7C%20%25%20%7B%0A%20%20%24XMLPerm%20%3D%20New-XmlNode%20%24XMLPermissions%20%22Permission%22%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22Entity%22%20%24_.Entity%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22EntityType%22%20%24_.EntityType%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22Group%22%20%24_.Group%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22Principal%22%20%24_.Principal%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22Propagate%22%20%24_.Propagate%0A%20%20Set-XmlAttribute%20%24XMLPerm%20%22Role%22%20%24_.Role%0A%7D%0A%0A%23%20Create%20XML%20file%0A%24global%3AvInventory.Save(%24XMLfile)%0A%7D%0A%0Afunction%20ImportSSO(%5Bstring%5D%20%24XMLfile)%7B%0A%23%20Functions%0Afunction%20New-Role%0A%7B%0A%20%20%20%20param(%24name%2C%20%24privIds)%0A%20%20%20%20Begin%7B%7D%0A%20%20%20%20Process%7B%0A%0A%20%20%20%20%20%20%20%20%24roleId%20%3D%20%24authMgr.AddAuthorizationRole(%24name%2C%24privIds)%0A%20%20%20%20%7D%0A%20%20%20%20End%7B%0A%20%20%20%20%20%20%20%20return%20%24roleId%0A%20%20%20%20%7D%0A%7D%0A%0Afunction%20Set-Permission%0A%7B%0Aparam(%0A%5BVMware.Vim.ManagedEntity%5D%24object%2C%0A%5BVMware.Vim.Permission%5D%24permission%0A)%0ABegin%7B%7D%0AProcess%7B%0A%20%20%20%20%24perms%20%3D%20%24authMgr.SetEntityPermissions(%24object.MoRef%2C%40(%24permission))%0A%7D%0AEnd%7B%0A%20%20%20%20return%0A%7D%0A%7D%0A%0A%23%20Main%0A%23%20Create%20hash%20table%20with%20the%20current%20roles%0A%24authMgr%20%3D%20Get-View%20AuthorizationManager%0A%24roleHash%20%3D%20%40%7B%7D%0A%24authMgr.RoleList%20%7C%20%25%20%7B%0A%20%20%20%20%24roleHash%5B%24_.Name%5D%20%3D%20%24_.RoleId%0A%7D%0A%0A%23%20Read%20XML%20file%0A%24vInventory%20%3D%20%5Bxml%5D%22%3Cdummy%2F%3E%22%0A%24vInventory.Load(%24XMLfile)%0A%0A%23%20Define%20Xpaths%20for%20the%20roles%20and%20the%20permissions%0A%24XpathRoles%20%3D%20%22Inventory%2FRoles%2FRole%22%0A%24XpathPermissions%20%3D%20%22Inventory%2FPermissions%2FPermission%22%0A%0A%23%20Create%20custom%20roles%0A%24vInventory.SelectNodes(%24XpathRoles)%20%7C%20%25%20%7B%0A%20%20%20%20if(-not%20%24roleHash.ContainsKey(%24_.Name))%7B%0A%20%20%20%20%20%20%20%20%24privArray%20%3D%20%40()%0A%20%20%20%20%20%20%20%20%24_.Privilege%20%7C%20%25%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%24privArray%20%2B%3D%20%24_.Name%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%24roleHash%5B%24_.Name%5D%20%3D%20(New-Role%20%24_.Name%20%24privArray)%0A%20%20%20%20%7D%0A%7D%0A%0A%23%20Set%20permissions%0A%24vInventory.SelectNodes(%24XpathPermissions)%20%7C%20%25%20%7B%0A%20%20%20%20%24perm%20%3D%20New-Object%20VMware.Vim.Permission%0A%20%20%20%20%24perm.group%20%3D%20%26%7Bif%20(%24_.Group%20-eq%20%22true%22)%20%7B%24true%7D%20else%20%7B%24false%7D%7D%0A%20%20%20%20%24perm.principal%20%3D%20%24_.Principal%0A%20%20%20%20%24perm.propagate%20%3D%20%26%7Bif(%24_.Propagate%20-eq%20%22true%22)%20%7B%24true%7D%20else%20%7B%24false%7D%7D%0A%20%20%20%20%24perm.roleId%20%3D%20%24roleHash%5B%24_.Role%5D%0A%0A%20%20%20%20%24EntityName%20%3D%20%24_.Entity.Replace(%22(%22%2C%22%5C(%22).Replace(%22)%22%2C%22%5C)%22)%0A%20%20%20%20%24EntityName%20%3D%20%24EntityName.Replace(%22%5B%22%2C%22%5C%5B%22).Replace(%22%5D%22%2C%22%5C%5D%22)%0A%20%20%20%20%24EntityName%20%3D%20%24EntityName.Replace(%22%7B%22%2C%22%5C%7B%22).Replace(%22%7D%22%2C%22%5C%7D%22)%0A%0A%20%20%20%20%24entity%20%3D%20Get-View%20-ViewType%20%24_.EntityType%20-Filter%20%40%7B%22Name%22%3D(%22%5E%22%20%2B%20%24EntityName%20%2B%20%22%24%22)%7D%0A%20%20%20%20Set-Permission%20%24entity%20%24perm%0A%7D%0A%7D%0A%0A%23%20Variables%0A%24XMLPath%20%3D%20%22C%3A%5CvCenter_SSO.xml%22%0A%24CSVPath%20%3D%20%22C%3A%5CvCenter_VM_Folders.csv%22%0A%0A%23%20Delete%20Files%0AIf%20(Test-Path%20%24XMLPath)%7B%0A%09Remove-Item%20%24XMLPath%0A%7D%0AIf%20(Test-Path%20%24CSVPath)%7B%0A%09Remove-Item%20%24CSVPath%0A%7D%0A%0A%23%20vCenter%20Login%0Awrite-host%20%22%22%0Awrite-host%20-nonewline%20%22vCenter%20User%20(ex.%20administrator%40vsphere.local)%20%3A%20%22%0A%24strVcenterUser%20%3D%20read-host%20%0A%0Awrite-host%20-nonewline%20%22vCenter%20Password%20%3A%20%22%0A%24strVcenterPass%20%3D%20read-host%20%0A%0A%23%20Legacy%20vCenter%20Values%20%0Awrite-host%20%22%22%0Awrite-host%20-nonewline%20%22Legacy%20vCenter%20FQDN%20%3A%20%22%0A%24vCenterLegacy%20%3D%20read-host%0Awrite-host%20-nonewline%20%22Legacy%20Datacenter%20Name%20%3A%20%22%0A%24DCLegacy%20%3D%20read-host%0A%0A%23%20New%20vCenter%20Values%20%0Awrite-host%20%22%22%0Awrite-host%20-nonewline%20%22New%20vCenter%20FQDN%20%3A%20%22%0A%24vCenterNew%20%3D%20read-host%0Awrite-host%20-nonewline%20%22New%20Datacenter%20Name%20%3A%20%22%0A%24DCNew%20%3D%20read-host%0A%0A%23%20Legacy%20vCenter%20Scripts%0AWrite-Host%20%22%22%3BWrite-Host%20%22Connecting%20to%22%20%24vCenterLegacy%20-ForegroundColor%20Yellow%0AConnectServer%20%24vCenterLegacy%0AWrite-Host%20%22%22%3BWrite-Host%20%22Exporting%20Folders%20from%22%20%24DCLegacy%20-ForegroundColor%20Yellow%0AExportFolder%20%24DCLegacy%0AWrite-Host%20%22Exporting%20Done%20!%22%20-ForegroundColor%20Green%0AWrite-Host%20%22%22%3BWrite-Host%20%22Exporting%20SSO%20to%22%20%24XMLPath%20-ForegroundColor%20Yellow%0AExportSSO%20%24XMLPath%0AWrite-Host%20%22Exporting%20Done%20!%22%20-ForegroundColor%20Green%0A%0A%23%20Disconnect%20Legacy%20vCenter%0ADisconnect-VIServer%20-Server%20%24vCenterLegacy%20-Confirm%3A%24false%0A%0A%23%20Pause%0AWrite-Host%22%22%3BWrite-Host%20%22Press%20Enter%20to%20Import%20!%22%20-ForegroundColor%20Red%0Apause%0A%0A%23%20New%20vCenter%20Scripts%0AWrite-Host%20%22Connecting%20to%22%20%24vCenterNew%20-ForegroundColor%20Yellow%0AConnectServer%20%24vCenterNew%0AWrite-Host%22%22%3BWrite-Host%20%22Importing%20Folders%20to%22%20%24DCNew%20-ForegroundColor%20Yellow%0AImportFolder%20%24DCNew%0AWrite-Host%20%22Importing%20Done%20!%22%20-ForegroundColor%20Green%0AWrite-Host%22%22%3BWrite-Host%20%22Importing%20SSO%20from%22%20%24XMLPath%20-ForegroundColor%20Yellow%0AImportSSO%20%24XMLPath%0AWrite-Host%22%22%3BWrite-Host%20%22Importing%20Done%20!%22%20-ForegroundColor%20Green%0A%0A%23%20Disconnect%20New%20vCenter%0ADisconnect-VIServer%20-Server%20%24vCenterNew%20-Confirm%3A%24false%0A%0A%23%20Done%0AWrite-Host%22%22%3BWrite-Host%20%22Script%20succesfully%20executed%20!%22%20-ForegroundColor%20Green » message= »Migration vCenter v0.1″ highlight= » » provider= »manual »/]