Copie o instantâneo de VM para um novo ambiente de VM

2

Temos dois ambientes VMWare separados, um deles é o ambiente principal, que possui centenas de máquinas virtuais em vários sites. O outro é muito menor instalado em um servidor, apenas para arquivar sistemas antigos.

O que eu gostaria de fazer é tirar um instantâneo do estado atual de uma de nossas VMs ao vivo e usá-la para copiar para o outro ambiente VMWare e criar uma nova máquina lá, usando isso como o arquivo desse sistema .

Isso será possível / fácil?

    
por Conn Warwicker 09.07.2015 / 12:57

2 respostas

4

Se você estivesse usando o vSphere 6, poderia ter feito clones inter-vCenter e acabar com isso.

Em qualquer evento, esta tarefa não é super-difícil com o 5.5, se você usar o PowerCLI.

Os passos são assim:

  1. Tire um instantâneo da VM (não use o PowerCLI ou qualquer uma das GUIs)
  2. Clone o snapshot em uma nova VM usando este pequeno e prático PowerCLI:
    New-VM -Name $CloneName -VM $SourceVM -Location $CloneFolder -Datastore $Datastore -ResourcePool $ResourcePool -VMHost $VMHost -LinkedClone -ReferenceSnapshot $Snapshot
    Você pode procurar aqui para o que todas as opções significam e como preenchê-las.
    A chave é a opção '-ReferenceSnapshot'.

  3. Exporte sua nova VM shinny para OVF / OVA ou copie a pasta do DS para algum lugar na rede

  4. Importa para o outro vCenter

Solicitei à equipe de segurança de TI que solicite uma cópia "forense" de uma VM em execução, incluindo instantâneos de memória, para que eles possam fazer algumas investigações nos casos em que houve um vírus ou algum tipo de violação. Para facilitar a minha vida, escrevi uma função PS que faz todo o trabalho pesado. Só precisa de uma VM de origem (por nome ou objeto) e uma pasta no disco. Faz o resto.

Function ExportVM {
    Param(
    [parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [PSObject]$SourceVM,

    [parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [String]$DestinationPath
    )

    #Check if the destination path exists, bail out if it doesn't
    if ( -not (Test-path $DestinationPath -IsValid) ) {
        Write-Warning "Please provide a valid path for the exported VM"
        return
    }

    #Get the SourceVM, bail out if it fails
    if ($SourceVM.GetType().Name -eq "string"){
        try {
            $SourceVM = Get-VM $SourceVM -ErrorAction Stop
        }
        catch [Exception]{
            Write-Warning "VM $SourceVM does not exist"
            return
        }
    }
    elseif ($SourceVM -isnot [VMware.VimAutomation.ViCore.Impl.V1.Inventory.VirtualMachineImpl]){
        Write-Warning "You did not pass a string or a VM object for 'SourceVM'"
        Return
    }

    try {
        $DestinationPath = $DestinationPath + "\" + $SourceVM.Name

        #Setup the required compoments to compute an MD5 hash
        $algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5")
        $md5StringBuilder = New-Object System.Text.StringBuilder 50
        $ue = New-Object System.Text.UTF8Encoding

        #Define the snapshot name
        $SnapshotName = "IT-Security Export - " + (Get-Date -UFormat "%b-%d-%Y, %R")
        #Create the snapshot
        $Snapshot = New-Snapshot -VM $SourceVM -Name $SnapshotName -Description "Snapshot for IT-Security Forensic export" -Memory -Quiesce -Confirm:$false

        $Snapshot

        #Define variables needed to create the clone
        $CloneFolder = $SourceVM.Folder
        $Datastore = Get-Datastore -RelatedObject $SourceVM
        $ResourcePool = Get-ResourcePool -VM $SourceVM
        $VMHost = Get-VMHost -VM $SourceVM

        #Build a unique name for the cloned machine based on the snapshot name
        $algo.ComputeHash($ue.GetBytes($SnapshotName)) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
        $CloneName = $SourceVM.Name +"_ITSecExport_" + $md5StringBuilder.ToString().SubString(0,15)

        #Clone the VM
        $CloneVM = New-VM -Name $CloneName -VM $SourceVM -Location $CloneFolder -Datastore $Datastore -ResourcePool $ResourcePool -VMHost $VMHost -LinkedClone -ReferenceSnapshot $Snapshot

        #Define the name of the PSDrive, based on the Datastore name
        $DSName = "ITSecExport_" + ($Datastore.name -replace "[^a-zA-Z0-9]","")
        #Check to see if it already exists, remove if it does
        if (Get-PSDrive | Where {$_.Name -like $DSName}) {
            Remove-PSDrive $DSName
        }
        #Add the new drive
        $PSDrive = New-PSDrive -Location $Datastore -Name $DSName -Scope Script -PSProvider VimDatastore -Root "\"

        #Define variables needed to copy the SourceVM's VMX and the snapshot's VMSN
        $SnapshotID = (Get-VM $SourceVM |Get-Snapshot | where {$_.Name -like $SnapshotName}).ExtensionData.ID
        $SourceVM_VMXPath = (Get-View $SourceVM).Config.Files.VmPathName.Split(" ")[1].replace("/","\")
        $SourceVM_VMSNPath = $SourceVM_VMXPath.Replace(".vmx", "-Snapshot" + $SnapshotID + ".vmsn")
        #$CloneVM_VMPath = (Get-View $CloneVM).Config.Files.VmPathName.Split(" ")[1].Split("/")[0]

        #Copy the VMSN and VMX
        Copy-DatastoreItem -Item ${DSName}:\$SourceVM_VMXPath -Destination $DestinationPath -Force
        Copy-DatastoreItem -Item ${DSName}:\$SourceVM_VMSNPath -Destination $DestinationPath -Force

        #Copy-DatastoreItem -Item ${DSName}:\$CloneVM_Path\* $DestinationPath"$CloneName" -Force -Recurse

        #Export the VM
        $CloneVM | Export-VApp -Destination $DestinationPath -Force

        #Clean up
        Remove-VM -DeletePermanently $CloneVM -Confirm:$false
        Remove-Snapshot -Snapshot $Snapshot -Confirm:$false
        Remove-PSDrive -Name $DSName
    }
    catch [Exception]{
        $ErrorMessage = $_.Exception.Message
        $FailedItem = $_.Exception.ItemName
        Write-Warning "Looks like we ran in to an error"
        Write-Warning "  $ErrorMessage"
        return
    }
}
    
por 09.07.2015 / 14:25
-1

Até onde eu sei, você pode simplesmente copiar Máquinas Virtuais entre hosts. Primeiro desligue com segurança e, em seguida, pare a VM; copie a pasta completa para o outro ambiente VMWare. Depois de copiar a pasta, na interface do usuário da web, vá para o menu Máquina virtual - > Adicione a Máquina Virtual ao Inventário e adicione a máquina copiada ao host. Ao ligar a máquina, você receberá uma mensagem perguntando se você copiou ou moveu a máquina, escolha " Copiado ". Depois de ter a VM sendo executada com sucesso no segundo ambiente VMWare, você poderá removê-la e excluí-la com segurança no primeiro ambiente VMWare. Dependendo da sua configuração de rede, você pode precisar alterar algumas configurações, mas deve funcionar bem.

    
por 09.07.2015 / 13:37