Vous pouvez personnaliser et utiliser l'exemple de script suivant pour cloner plusieurs machines virtuelles (VM).
Pour copier et coller le contenu du script sans saut de page, utilisez la version HTML de cette rubrique, disponible sur la page de documentation d'Horizon 7 à l'adresse https://docs.vmware.com/fr/VMware-Horizon-7/index.html.
Entrée du script
Ce script lit un fichier d'entrée, qui est décrit dans la section .. Ce script demande également de façon interactive les informations suivantes :
- Adresse IP de vCenter Server
- Nom de connexion de l'administrateur pour vCenter Server
- Mot de passe de l'administrateur pour vCenter Server
- Type de clone, qui peut uniquement être complet
- S'il faut désactiver une console VM vSphere
Contenu du script
<# Create Clones from a Master VM The Tool supports creation of Full clone from Master VM. #> #------------------------- Functions ------------------------- function GetInput { Param($prompt, $IsPassword = $false) $prompt = $prompt + ": " Write-Host $prompt -NoNewLine [Console]::ForegroundColor = "Blue" if ($IsPassword) { $input = Read-Host -AsSecureString $input = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($input)) } else { $input = Read-Host } [Console]::ResetColor() return $input } function IsVMExists () { Param($VMExists) Write-Host "Checking if the VM $VMExists already Exists" [bool]$Exists = $false #Get all VMS and check if the VMs is already present in VC $listvm = Get-vm foreach ($lvm in $listvm) { if($VMExists -eq $lvm.Name ) { $Exists = $true } } return $Exists } function Disable_VM_Console() { Param($VMToDisableConsole) $vmConfigSpec = New-Object VMware.Vim.VirtualMachineConfigSpec $extra = New-Object VMware.Vim.optionvalue $extra.Key="RemoteDisplay.maxConnections" $extra.Value="0" $vmConfigSpec.extraconfig += $extra $vm = Get-VM $VMToDisableConsole | Get-View $vm.ReconfigVM($vmConfigSpec) } function Delete_VM() { Param($VMToDelete) Write-Host "Deleting VM $VMToDelete" Get-VM $VMToDelete | where { $_.PowerState –eq "PoweredOn" } | Stop-VM –confirm:$false Get-VM $VMToDelete | Remove-VM –DeleteFromDisk –confirm:$false } #------------------------- Main Script ------------------------- $vcAddress = GetInput -prompt "Your vCenter address" -IsPassword $false $vcAdmin = GetInput -prompt "Your vCenter admin user name" -IsPassword $false $vcPassword = GetInput -prompt "Your vCenter admin user password" -IsPassword $true $cloneType = GetInput -prompt 'Clone Type ("full")' -IsPassword $false $disableVMConsole = GetInput -prompt 'Disable vSphere VM Console ("yes" or "no", recommend "yes")' -IsPassword $false "-----------------------------------------------------" $csvFile = '.\CloneVMs.csv' # Check that user passed only full clone if (($CloneType.length >0) -and ($CloneType -ne "full")) { write-host -ForeGroundColor Red "Clone type supports only 'full' (case sensitive)" exit } if (($disableVMConsole.length >0) -and ($disableVMConsole -ne "yes" -or $disableVMConsole -ne "no")) { write-host -ForeGroundColor Red "Disable vSphere VM Console supports only 'yes' or 'no' (case sensitive)" exit } #check if file exists if (!(Test-Path $csvFile)) { write-host -ForeGroundColor Red "CSV File $CSVFile not found" exit } # Connect to the VC (Parameterize VC) #Connect to vCenter $VC_Conn_State = Connect-VIServer $vcAddress -user $vcAdmin -password $vcPassword if([string]::IsNullOrEmpty($VC_Conn_State)) { Write-Host 'Exit since failed to login vCenter' exit } else { Write-Host 'vCenter is connected' } #Read input CSV file $csvData = Import-CSV $csvFile #$csvData = Import-CSV $csvFile -header("VMName","Parentvm","CustomSpec","Datastore","Host","FromSnapshot","DeleteIfPresent") foreach ($line in $csvData) { "`n-----------------------------------------------------" $VMName = $line.VMName write-host -ForeGroundColor Yellow "VM: $VMName`n" $destVMName=$line.VMName $srcVM = $line.Parentvm $cSpec = $line.CustomSpec $targetDSName = $line.Datastore $destHost = $line.Host $srcSnapshot = $line.FromSnapshot $deleteExisting = $line.DeleteIfPresent if (IsVMExists ($destVMName)) { Write-Host "VM $destVMName Already Exists in VC $vcAddress" if($deleteExisting -eq "TRUE") { Delete_VM ($destVMName) } else { Write-Host "Skip clone for $destVMName" continue } } $vm = get-vm $srcvm -ErrorAction Stop | get-view -ErrorAction Stop $cloneSpec = new-object VMware.VIM.VirtualMachineCloneSpec $cloneSpec.Location = new-object VMware.VIM.VirtualMachineRelocateSpec Write-Host "Using Datastore $targetDSName" $newDS = Get-Datastore $targetDSName | Get-View $CloneSpec.Location.Datastore = $newDS.summary.Datastore Set-VM -vm $srcVM -snapshot (Get-Snapshot -vm $srcVM -Name $srcSnapshot) -confirm:$false $cloneSpec.Snapshot = $vm.Snapshot.CurrentSnapshot $cloneSpec.Location.Host = (get-vmhost -Name $destHost).Extensiondata.MoRef $CloneSpec.Location.Pool = (Get-ResourcePool -Name Resources -Location (Get-VMHost -Name $destHost)).Extensiondata.MoRef # Start the Clone task using the above parameters $task = $vm.CloneVM_Task($vm.parent, $destVMName, $cloneSpec) # Get the task object $task = Get-Task | where { $_.id -eq $task } #Wait for the taks to Complete Wait-Task -Task $task $newvm = Get-vm $destVMName $customSpec = Get-OSCustomizationSpec $cSpec Set-vm -OSCustomizationSpec $cSpec -vm $newvm -confirm:$false if ($disableVMConsole -eq "yes") { Disable_VM_Console($destVMName) } # Start the VM Start-VM $newvm } Disconnect-VIServer $vcAddress -Confirm:$false exit
Exécution du script
Les messages suivants proviennent d'une exécution du script :
PowerCLI C:\scripts> .\CloneVMs.ps1 Your vCenter address: 10.117.44.17 Your vCenter admin user name: administrator Your vCenter admin user password: ******* Clone Type<"Full"> : Full Disable vSphere VM Console ("yes" or "no", recommend "yes") : yes
La durée du processus de clonage dépend du nombre de machines de poste de travail et peut aller de plusieurs minutes à plusieurs heures. Pour vérifier que le processus est terminé, dans vSphere Client, assurez-vous que la dernière machine virtuelle de poste de travail est mise sous tension, qu'elle dispose de son propre nom d'hôte unique et que VMware Tools est exécuté.