Microsoft Azure

Copiando una máquina virtual a través de un snapshot utilizando PowerShell

Hola, en este artículo veremos cómo realizar una copia de una máquina virtual a otra región, mientras que podemos asignarlo a otro grupo de recursos y cambiarle el nombre.

Prerrequisitos:

Disclaimer: Dada la constante actualización de las tecnologías de Cloud Computing algunos pasos pueden ser diferentes al momento de leer el artículo, haré el esfuerzo por mantenerlo actualizado, pero podría haber algunas diferencias entre lo que se muestre a continuación y la consola de Azure al momento de la implementación.

Tomando el snapshot del disco de la máquina virtual y llevarlo como VHD a un Storage Account

Para realizar las actividades necesitamos la máquina virtual de origen y con los siguientes comandos crear recursos y copiar la información de la máquina virtual con el objetivo de crear una nueva con la misma información.
  1. Ingresar a la interfaz de PowerShell ISE y e ingresaremos a nuestra suscripción con el comando:
    Connect-AzAccount
    
    Dar click en el botón de run script o presionar F5
  2. Aparecerá una ventana emergente. Ingresar las credenciales de tu suscripción de Azure
  3. En caso de tener varias suscripciones en tu cuenta ejecutar el comando:
    Select-AzSubscription -Subscription <Subscription ID>
    
    Nota: Para encontrar el ID de suscripción para agregarlo al parámetro -Subscription, en el portal de Azure ir al recurso Subscriptions y allí veremos el Subscription ID.
  4. Agregamos los siguientes comandos:
    #Asigne el nombre del resource group de destino
    $destResourceGroupName ="rg-vmdest"
    
    #Proveer el nombre de la región de destino donde se crearán el resource group y los recursos a migrar 
    #(Si deseamos traer la lista de regiones puede ejecutar el comando Get-AzLocation | select Location )
    $destinationRegion ="brazilsouth"
    
    #Crear el resource group
    New-AzResourceGroup -Name $destresourceGroupName -Location $destinationRegion
    
    #Asignar el nombre de la cuenta de almacenamiento donde desea copiar el snapshot (en minúscula y sin caracteres especiales)
    $destStorageAccountName = "sadestvvillar"
    
    #Crear el storage account
    $destStorageAccount = New-AzStorageAccount -name $destStorageAccountName -Location $destinationRegion -ResourceGroupName $destResourceGroupName -SkuName Standard_LRS
    
    #Capturar el contexto del storage account dentro de una variable
    $destinationContext = $destStorageAccount.Context
    
    #Asignar el nombre del container donde se almacenará el snapshot
    $destStorageContainerName = "containerdestvvillar"
    
    #Crear el container dentro del storage account
    New-AzStorageContainer -Name $destStorageContainerName -Context $destinationContext
    
    #Asignar el nombre del archivo VHD al que se copiará la instantánea (indicar la extension .vhd al final)
    $destinationVHDFileName = "vhddest-vvillar.vhd"
    
    #Asigne la clave de la cuenta de almacenamiento donde desea copiar la instantánea.
    $storageAccountKey = (Get-AzStorageAccountKey -ResourceGroupName $destResourceGroupName -Name $destStorageAccount.StorageAccountName).Value[0]
    
    #Asignar la información de la VM de la que se tomará el snapshot
    $resourceGroupNameVM = 'rg-vmdemo'
    $locationVM = 'South Central US'
    $vmName = 'demo'
    
    #Obtener la VM
    $vm = get-azvm -ResourceGroupName $resourceGroupNameVM -Name $vmName
    
    #Tomar las configuraciones para el snapshot. Para este ejemplo el snapshot es del disco del S.O.:
    $snapshot =  New-AzSnapshotConfig -SourceUri $vm.StorageProfile.OsDisk.ManagedDisk.Id -Location $locationVM -CreateOption copy
    
    #Asignar el nombre del snapshot
    $snapshotName = "snapshotvvillar"
    
    #Generar el snapshot
    New-AzSnapshot -Snapshot $snapshot -SnapshotName $snapshotName -ResourceGroupName $destresourceGroupName
    
    #Asigne la duración del vencimiento de la firma de acceso compartido (SAS) en segundos, por ejemplo 3600.
    #Conozca más sobre SAS aquí: https://docs.microsoft.com/en-us/Az.Storage/storage-dotnet-shared-access-signature-part-1
    $sasExpiryDuration = "3600"
    
    #Generar el SAS para el snapshot
    $sas = Grant-AzSnapshotAccess -ResourceGroupName $destresourceGroupName -SnapshotName $snapshotName -DurationInSecond $sasExpiryDuration -Access Read
    
    #Cree el contexto para el storage account que se usará para copiar el snapshot 
    $destinationContext = New-AzStorageContext -StorageAccountName $deststorageAccountName -StorageAccountKey $storageAccountKey
    
    #Copiar el snapshot al storage account como vhd
    Start-AzStorageBlobCopy -AbsoluteUri $sas.AccessSAS -DestContainer $destStorageContainerName -DestContext $destinationContext -DestBlob $destinationVHDFileName
    
    #Dependiendo del tamaño del archivo esto puede demorar unos minutos, para ver el estado del avance digitar el comando
    Get-AzStorageBlobCopyState -Blob $destinationVHDFileName -Container $destStorageContainerName -Context $destinationContext
    

Crear un managed disk utilizando el archivo VHD

Una vez tenemos el vhd pasaremos a crear el managed disk del sistema operativo

#Asignar el nombre del managed disk
$diskName = 'diskvvillar'

#Proporcionar el tamaño del disco en GB. Debe ser mayor que el tamaño del archivo VHD.
$diskSize = '128'

#Proporcione el tipo de almacenamiento para el managed disk. Premium_LRS, StandardSSD_LRS o Standard_LRS.
$storageType = 'Premium_LRS'

#Proporcione el URI del archivo VHD (blob de página) en una cuenta de almacenamiento. Tenga en cuenta que este NO es el URI de SAS del contenedor de almacenamiento donde se almacena el archivo VHD.
#Por ejemplo https://sadestvvillar.blob.core.windows.net/containerdestvvillar/vhddest-vvillar.vhd
#Nota: El archivo VHD se puede eliminar tan pronto como se cree el managed disk.
$sourceVHDURI = 'https://sadestvvillar.blob.core.windows.net/containerdestvvillar/vhddest-vvillar.vhd'

#Proporcione el ID de la cuenta de almacenamiento donde se almacena el archivo VHD.
#Por ejemplo /subscriptions/1d4dadfadffab2-6sdf8c0-adsfa449a-a205-cadfsa2320/resourceGroups/rg-vmdest/providers/Microsoft.Storage/storageAccounts/sadestvvillar
#Este es un parámetro opcional si está creando un managed disk en la misma suscripción
$storageAccountId = '/subscriptions/1d4dfab2-68c0-449a-a205-cd0bbe232320/resourceGroups/rg-vmdest/providers/Microsoft.Storage/storageAccounts/sadestvvillar'

#Crear y asignar la configuración del disco
$diskConfig = New-AzDiskConfig -AccountType $storageType -Location $destinationRegion -CreateOption Import -StorageAccountId $storageAccountId -SourceUri $sourceVHDURI

#Crear el managed disk
New-AzDisk -Disk $diskConfig -ResourceGroupName $destResourceGroupName -DiskName $diskName

Crear la máquina virtual utilizando el managed disk

#Traer la configuración de la red virtual en donde se creará la máquina virtual 
$vnetName = 'vnet-vvillar2'
$vnetResourceGroup = 'rg-vnetrecursosred'
Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $vnetResourceGroup

$destinationResourceGroup = 'rg-recursosdest'
$destinationRegion ="brazilsouth"
#Crear una IP pública de tipo static
$ipName = "pip-vm-vvillar2"
$pip = New-AzPublicIpAddress -Name $ipName -ResourceGroupName $destinationResourceGroup -Location $destinationRegion -AllocationMethod Static

#Crear la tarjeta de interfaz de red
$nicName = "nic-vm-vvillar2"
$SubnetID="/subscriptions/3bb00c13-3e17-4197-b202-807f9ad5128a/resourceGroups/rg_red/providers/Microsoft.Network/virtualNetworks/vnet_vvillar/subnets/Subnet_Prod_Web"
$nic = New-AzNetworkInterface -Name $nicName `
   -ResourceGroupName $destinationResourceGroup `
   -Location $destinationRegion -SubnetId $SubnetID -PublicIpAddressId $pip.Id

#Obtener lista de tamaños de VMs
Get-AzVMSize -Location $destinationRegion

#Establecer el nombre de la VM y el tamaño
$vmName2 = "vm-vvillar2"
$vmConfig = New-AzVMConfig -VMName $vmName2 -VMSize "Standard_B4ms"

#Añadir la tarjeta de interfaz de red
$vm = Add-AzVMNetworkInterface -VM $vmConfig -Id $nic.Id

#Traer el disco de sistema operativo
$osDisk = Get-AzDisk -DiskName $diskName -ResourceGroupName $destResourceGroupName 

#Añadir el disco del sistema operativo
#Nota: Indicar en el ultimo parámetro si el sistema operativo es Windows o Linux
$vm = Set-AzVMOSDisk -VM $vm -ManagedDiskId $osDisk.Id -StorageAccountType Premium_LRS -DiskSizeInGB 30 -CreateOption Attach -Linux

#Completar la creación de la VM
New-AzVM -ResourceGroupName $destResourceGroupName -Location $destinationRegion -VM $vm

#Verificar que la VM fue creada
Get-AzVM -ResourceGroupName $destResourceGroupName -Name $vm.Name
0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments