En este articulo, vamos a ver como generar una imagen de Azure a partir de una máquina virtual local, y la alojaremos en Shared Image Gallery.

Partimos de una máquina virtual en entorno OnPremise, vamos a preparar esta máquina para poder subirla a Azure por medio de un VHD generalizado. Crearemos una cuenta de almacenamiento en Azure, subiremos el VHD y crearemos una imagen a partir de él.

Una vez creado la imagen generaremos una nueva Shared Image Gallery e importaremos la imagen, junto con todos sus datos para que sea facilmente visible por un posible equipo “mantenedor”. Añadiremos varias localizaciones e instancias para entender el funcionamiento.

Lo primero que tenemos que tener claro, son las necesidades que debemos cumplir para subir un VHD a Azure.

  • Disco VHD o VHDX (VHDX se puede convertir fácilmente a VHD)
  • Generacion 1 o 2 de máquina en HyperV
  • Tamaño de disco fijo y máximo permitido 1023 Gb

Partimos de que tenemos una maquina con Windows10 insider.

Hemos personalizado la imagen instalando WSL en el usuario vjrodilla, y tiene descargado en C:\ el repo de Ubuntu.

Tenemos que seguir una serie de pasos para preparar la máquina, antes de subirla a Azure. Para que el articulo no se quede desfasado pronto, os dejo el enlace de Microsoft directamente, donde nos dice que acciones debemos realizar.

https://docs.microsoft.com/es-es/azure/virtual-machines/windows/prepare-for-upload-vhd-image

Una vez realizado los pasos indicados por Microsoft, generalizamos nuestra máquina virtual, para ello vamos a utilizar la herramienta Sysprep:

c:\Windows\System32\Sysprep\sysprep.exe

Tenemos que seleccionar las opciones:

  • Enter System Out-of-Box Experience (OOBE)
  • Marcar el check de Generalizar
  • Shutdown, si no marcamos esto la máquina vuelve a encender y empieza a modificarse y ya no nos valdría.

Le damos a OK, y empieza el proceso.

Una vez la imagen ha sido generalizada, nos aparecerá apagada en nuestro HyperV en este caso, Vmware o similar.

Nuestro disco es Generación 2 y VHDX, por suerte no es de expansión dinámica si no, tendríamos todas las de fallar.

Ejecutamos:

#ruta del vhdx de origen
$vhdxdisk = "C:\Users\Public\Documents\Hyper-V\Virtual Hard Disks\w10_ins.vhdx"
#ruta donde queremos guardar el vhd (por ejemplo un disco secundario, si no tenemos espacio)
$vhddisk = "D:\w10_ins.vhd"
#realizamos la conversion
Convert-VHD –Path $vhdxdisk –DestinationPath $vhddisk -VHDType Fixed

En este paso nos acordaremos, nos vendrá a la cabeza, el momento cuando configuramos el tamaño del disco “burro grande ande o no ande” 🙂

Mientras vamos creando la cuenta de almacenamiento que necesitamos para llevar a cabo la subida de la imagen:

Bien lo primero que tenemos que hacer es inicializar variables:

$sub = Get-AzSubscription | Select-AzSubscription
$rg = "RGGallery" 
$location = "westeurope"

Se pueden llegar a crear más (al gusto de cada uno)

Ahora vamos a crear el grupo de recursos

Connect-AzAccount -Credential (Get-Credential) 
New-AzResourceGroup -Name $rg -Location $location 

Ya tenemos el grupo de recursos, podemos proceder a crear la cuenta de almacenamiento:

New-AzStorageAccount  -Location $location -ResourceGroupName $rg -Name sagallery -SkuName "Standard_LRS" -Kind "StorageV2"

Ya tenemos nuestra cuenta de almacenamiento, ahora vamos a crear una carpeta dentro de ella para poder añadir información, esta carpeta recibe el nombre de “container” y en nuestro caso añadiremos VHDs importados desde entornos OnPremises.

#Seleccionamos la cuenta de almacenamiento donde queremos añadir la carpeta
$sa = Get-AzStorageContainer -Name "sagallery"
#Guardamos el contexto de la cuenta de almacenamiento
$ctx= $sa.Context
#creamos la nueva carpeta
New-AzStorageContainer -Name "vhd" -Context $ctxt -Permission blob 

Una vez preparada la cuenta de almacenamiento y su contenedor, vamos a subir nuestro VHD:

#inicializamos variables
$sub = Get-AzSubscription | Select-AzSubscription
$rg = "RGGallery"
#indicamos la url que tendrá la imagen una vez subida en la cuenta de almacenamiento
$urlvhd = "https://sagallery.blob.core.windows.net/vhd/W10ins.vhd"
#indicamos que imagen queremos subir
$locationvhd="D:\w10_ins.vhd"

Connect-AzAccount -Credential (Get-Credential)

#Subimos la imagen a la ruta indicada
Add-AzVhd -ResourceGroupName $rg -Destination $urlvhd -LocalFilePath $locationvhd 

Ya tenemos nuestro VHD subido a Azure. Ahora vamos a crear la imagen a partir del vhd subido.

#inicializamos las variables necesarias
$imageConfig = New-AzImageConfig -Location $location
$imageConfig = Set-AzImageOsDisk `
    -Image $imageConfig `
    -OsType Windows `
    -OsState Generalized `
    -BlobUri $urlvhd `
    -DiskSizeGB 128

Y lanzamos el despliegue de la nueva imagen

New-AzImage -ImageName $imageName -ResourceGroupName $rg -Image $imageConfig

Y con esto ya tenemos nuestra imagen, y podemos usarla para nuevos despliegues.

Una vez hemos creado la imagen, vamos a crear nuestro repositorios de imagen, en este caso Azure dispone de Shared Image Gallery.

Nos vamos al portal de Azure y vamos a crear un nuevo recurso, buscamos Shared Image Gallery

Creamos por defecto, no le añadimos Tags, y la generamos en West Europe.

Aclaramos algunos conceptos:

Publisher: Quien ha creado la imagen. Microsoft

Offer: Nombre del grupo de Imagenes. WindowsServer

Sku: Una instancia o versión principal de una distribución. 2019

Le ofrecemos la version, la localización de nuestra imagen, cargamos la imagen que acabamos de subir en “Source Image”, si no queremos utilizar la última versión, le decimos que nos la excluya, añadimos la fecha de subida y configuramos el conjunto de replicas y regiones disponibles.

Esto quiere decir el número de “clones” de la imagen que tendremos disponibles para despliegues en paralelo (principalmente para “aliviar” la carga) y las regiones desde las que podremos desplegarlo. Sobre todo para evitar la latencia entre zonas.

Podemos añadirle URLs referentes a la versión, como el contrato EULA, descripción, etc… nosotros solo vamos a rellenar el campo descripción, y VM deployment.

En el apartado VM deployment nosotros configuramos las recomendaciones de máquinas para desplegar la imagen que hemos desarrollado, pero esto no obliga, al usuario que esté utilizando la VM a tener unas características específicas.

El tamaño de la memoria dice que es MB, es bastante extraño que te permita un mínimo de 1 y un máximo de 4000, ¿Solo 4 Gb de RAM? Es Microsoft, si nos recomendaba 128 CPU por defecto no tiene sentido esa capacidad de RAM 😀

Hemos excluidos discos premium SSD (por ejemplo) y le ponemos de fecha de soporte hasta dentro de 2 años.

Ejecutamos la creación.

Como nota, hemos añadido la fecha de final de ciclo de la imagen, y aunque hemos seleccionado visualmente el calendario para confirmar la fecha, nos da un error en el despliegue.

Nos indica que la fecha de fin de ciclo no puede ser anterior a la de despliegue. Le damos a Re-deploy y configuramos la fecha de nuevo(debe ser un error actual de la plantilla de imagen) Cuando vamos a rellenarnos vemos que nos ofrece la misma fecha que pusimos en la de creación (lo corregirán a  futuro)

(La restricción de tipo de discos le hace poco caso también)

Depende de las instancias que hayamos elegido y el número de zonas puede variar el tiempo de despligue. En mi caso tardó como 40 minutos.

Ya tenemos nuestra galería de imágenes y nuestra imagen subida.

Entramos en Win10ins y vemos a la derecha, nos da información acerca de la versión de la imagen, y arriba a la derecha nos permite crear una VM directamente. Vamos a crear una máquina a partir de ella:

Desplegar una maquina virtual a partir de una imagen, es similar al asistente habitual, por lo que no voy a indicar los pasos, solo os muestro un resumen del despliegue:

Ya tenemos la máquina creada VMCustomImage:

Y al conectar, con el usuario que hemos generado al crear la VM, nos dice que no disponemos de permiso:


Reseteamos la contraseña desde el propio portal, que reinicia las credenciales y nos da permiso de administrador local de la máquina. Voy a usar el usuario que yo tenía de vjrodilla.

Probamos si tiene WSL:


Si se os ocurre cualquier mejora, hacemos evolutivo 😀