Subir un vhd de datos a través de Windows Azure PowerShell y asociarlo a una VM

Una tarea común cuando trabajamos con máquinas virtuales es subir un conjunto de archivos o ejecutables para tenerlos disponibles desde el cloud.
Como sabéis, desde la administración de nuestro equipo, en Disk Management podemos crear discos VHD, montarlos en nuestro local, añadir los elementos necesarios y desmontarlo de nuevo con el objetivo de que pueda ser trasladado a otra máquina.

En este post voy a mostrar cómo es posible subir un vhd utilizando Windows Azure PowerShell y cómo podríamos montarlo en una máquina virtual existente.
Si todavía no tienes instalado Windows Azure Powershell puedes hacerlo desde la página de descargas de Windows Azure (Command-line tools – Windows PowerShell).

Si es la primera vez que utilizamos la consola con una suscripción, el primer paso es recuperar el archivo con la configuración de la misma:

Get-AzurePublishSettingsFile

Este comando abrirá una ventana de nuestro navegador y descargará el archivo. Una vez lo hemos recuperado, importamos el mismo a través del siguiente comando:

Import-AzurePublishSettingsFile 'C:\vms\My-subscription.publishsettings'

A partir de este momento tenemos acceso a todos los servicios creados en esta suscripción. Con la conexión establecida a través de Powershell, y nuestro vhd listo, debemos lanzar el siguiente comando para que inicie la subida a la plataforma:

Add-AzureVhd -Destination http://gisvhds.blob.core.windows.net/vhds/gis.vhd -LocalFilePath C:\vms\gis.vhd

Una vez finalizado, el mensaje por consola debería ser parecido al siguiente:

vhd uploaded Windows Azure Powershell

Para asociar este vhd a una máquina virtual, primero debemos registrarlo como disco:

Add-AzureDisk -DiskName "mydata" -MediaLocation "http://gisvhds.blob.core.windows.net/vhds/gis.vhd" -Label "gisvhd"

A partir de este momento, aparecerá en el apartado Disks de Virtual Machines:

Virtual Marchines Disks

Por último, vinculamos el mismo a la máquina que queramos a través de Add-AzureDataDisk:

 Get-AzureVM "myiisservice" -Name "VM1" ` | Add-AzureDataDisk -Import -DiskName "mydata" -LUN 0 ` | Update-AzureVM

Podemos comprobar en el portal que el disco queda asociado a la máquina seleccionada:

mydata attached to VM1

Dependiendo del tamaño de nuestra máquina podremos agregar un número determinado de discos. Esta información se puede consultar en Virtual Machine and Cloud Service Sizes for Windows Azure.

Espero que sea de utilidad.

¡Saludos!

Instalar Windows Azure Service Management CmdLets en Windows 7 SP 1 con Windows Azure SDK 1.4

Después de la nueva versión del SDK de Windows Azure y el Service Pack 1 de Windows 7, podemos encontrarnos ciertas trabas si intentamos instalar Windows Azure Service Management CmdLets:

Esto puede ocurrir principalmente por varios motivos:

  • Tenemos instalado el service pack 1 para Windows 7.
  • Hemos actualizado a Windows Azure SDK 1.4
  • Ambos :D

 Al no tener las nuevas versiones contempladas tanto en uno de los archivos de configuración como en uno de los script de powershell no puede reconocer las nuevas versiones tanto de compilación del sistema operativo como la del SDK. Para solucionarlo, podemos realizar los siguientes pasos:

Añadir el builder number de Windows 7 con sp 1

Dentro del directorio de WASM nos ubicamos en WASMCmdletssetup. Dentro de la misma tenemos un archivo llamado Dependencies.dep el cual lo abrimos con el Notepad para añadir el nuevo build number.

En este archivo podemos ver y modificar todas las dependencias necesarias para la instalación e incluso modificar la descripción y la url donde de donde podemos descargar la dependencia requerida. Centrándonos en el sistema operativo, como vemos en la imagen anterior, vemos que aparece un atributo llamado buildNumber el cual contiene todas las numeraciones de las compilaciones válidas. 7600 se corresponde con Windows 7 sin service pack. ¿Cómo sabemos cuál es la versión de compilación del sistema operativo? La forma más sencilla de llegar a este valor es abriendo una aplicación propietaria de Microsoft integrada en el sistema operativo que tenemos instalado. Por ejemplo, abrimos la aplicación Paint y pulsamos sobre About Paint/Sobre Paint.

Voilà! En este caso podemos confirmar que 7601 se corresponde con Windows 7 SP 1:D

El siguiente paso se trata de modificar uno de los powershell donde se verifica la versión del SDK de Windows Azure dentro del registro. En la versión anterior, el número anterior se correspondía con la 1.3.11122.0038.

Para que la comprobación se realice con éxito, necesitamos cambiar el valor de SearchVersion a 1.4.20227.1419 como se muestra en la imagen.

¡Listo! ya tenemos adaptadas todas las comprobaciones para lanzar de nuevo la instalación.

Espero que sea de utilidad :D

¡Saludos!

PowerShell para la administración de nuestras aplicaciones en Windows Azure

En muchos post hemos visto la forma de utilizar el portal de la plataforma para desplegar, actualizar, eliminar, etcétera los servicios que tenemos actualmente ejecutándose en la nube. Pero esta no es la única alternativa para realizar estas tareas más propias del administrador ;). La otra opción es utilizando la API de administración que nos proporciona Windows Azure. Podemos hacer uso de la misma a través de REST o también usando Windows Azure Management CmdLets,  un snap-in para PowerShell que actúa como wrap de la API facilitándonos el trabajo. Podemos descargarlo a través del siguiente enlace.

Una vez descargado, descomprimimos el archivo y abrimos con Visual Studio la solución alojada en la carpeta code para compilar la misma. Es posible que no encuentre la librería Microsoft.WindowsAzure.StorageClient por lo que debemos eliminar la referencia existente y agregar la última versión del SDK 1.3 de esta librería. Compilamos la solución y ejecutamos el archivo startHere.cmd para instalar los componentes necesarios, además del snap-in.

Ya estamos listos para administrar nuestras aplicaciones a golpe de comando :). Abrimos una ventana de Windows PowerShell/Windows PowerShell ISE  y ejecutamos lo siguiente:

Add-PSSnapin AzureManagementToolsSnapIn

Con este comando lo único que estamos haciendo es añadir el snap-in que acabamos de instalar a la sesión actual. Para comprobar que funcionó correctamente podemos recuperar los comandos disponibles:

Get-Command -PSSnapIn AzureManagementToolsSnapIn

Lanzar un nuevo despliegue

 Uno de los objetivos más comunes sería desplegar un paquete en uno de los entornos. Para ello utilizaremos el comando New-Deployment con los siguientes parámetros obligatorios:

New-Deployment -serviceName <LOWER_CASE_SERVICENAME>
-storageServiceName <LOWER_CASE_STORAGE_SERVICE_NAME>
-subscriptionId <YOUR_SUBSCRIPTION_ID>
-certificate (get-item cert:CurrentUserMY<CERTIFICATE_THUMPRINT>)
-slot staging –package <PACKAGE_LOCATION> -configuration <CONFIGURATION_LOCATION>
-label "From PS"

Un ejemplo del comando anterior podría ser el siguiente:

New-Deployment -serviceName returngis -storageServiceName myazurestorage
-subscriptionId 5rtegtsw-0i93d-46b0-5tre-nh64w24
-certificate (get-item cert:CurrentUserMY327BBBABFE909FDJGR9ERJGFGDDFS30E76D370F2F95)
-slot staging –package c:DeployWindowsAzurePowerShell.cspkg
-configuration C:DeployServiceConfiguration.cscfg -label "From PS"

(Los datos son ficticios ;))

Si utilizamos un cliente para visualizar los containers en la cuenta de Storage que hemos incluido en la llamada, podemos ver que existe un nuevo container llamado mydeployments con todos los paquetes utilizados para los despliegues a través de PowerShell.

Si bien con el anterior comando hemos conseguido desplegar un nuevo paquete en el entorno de staging, la máquina virtual no ha sido arrancada :( Afortunadamente esta acción también podemos ejecutarla desde PowerShell utilizando el Set-DeploymentStatus:

Set-DeploymentStatus -status running -slot <staging/production>
-serviceName <LOWER_CASE_SERVICENAME>
-SubscriptionId <YOUR_SUBSCRIPTION_ID>
-certificate (get-item cert:CurrentUserMY<CERTIFICATE_THUMPRINT>)

Un ejemplo de lo anterior podría ser lo siguiente:

Set-DeploymentStatus -status running -slot staging
-serviceName returngis -SubscriptionId 5rtegtsw-0i93d-46b0-5tre-nh64w24
-certificate (get-item cert:CurrentUserMY327BBBABFE909FDJGR9ERJGFGDDFS30E76D370F2F95)

Eliminiar despliegue

Para eliminar un despliegue los parámetros son prácticamente los mismos que al realizar la subida, a excepción de especificar los paquetes.

Remove-deployment -slot staging -serviceName <LOWER_CASE_SERVICENAME>
 -subscriptionId <YOUR_SUBSCRIPTION_ID>
 -certificate (get-item cert:CurrentUserMY<CERTIFICATE_THUMPRINT>)

Si nos fijamos en la consola, podemos pensar que el despliegue se ha eliminado correctamente… Lo cual no es cierto.

El mensaje de error nos avisa que Windows Azure no puede eliminar un despliegue cuando el mismo se está ejecutando, por lo que tendremos que utilizar el comando anterior, Set-DeploymentStatus, pero esta vez para suspender la ejecución de la máquina virtual.

Set-DeploymentStatus -status suspended -slot <staging/production>
-serviceName <LOWER_CASE_SERVICENAME>
-SubscriptionId <YOUR_SUBSCRIPTION_ID>
-certificate (get-item cert:CurrentUserMY<CERTIFICATE_THUMPRINT>)

¿Cómo podemos saber cuándo ha finalizado un proceso?

Debido a que las acciones que lanzamos se llevan a cabo en segundo plano no podemos saber cuándo ha finalizado el proceso. Por ello, podemos asignarle un comando adicional separado por un pipeline para permanecer en espera hasta que la ejecución finalice. Este comando es Get-OperationStatus -WaitToComplete

Set-DeploymentStatus -status running -slot staging -serviceName <LOWER_CASE_STORAGE_SERVICE_NAME>
-SubscriptionId <YOUR_SUBSCRIPTION_ID>
-certificate (get-item cert:CurrentUserMY<CERTIFICATE_THUMPRINT>) | Get-OperationStatus -WaitToComplete

Si estamos utilizando Windows PowerShell ISE aparecerá una nueva ventana con el progreso:

Espero que sea de utilidad :)

¡Saludos!