Cómo crear una VM en Azure con script Powershell

Para que todo sea un poco más fácil, el equipo de Windows Azure nos da un paquete que contiene cmdlets de administración de Windows Azure, lo primero que tenemos que hacer es descargarlo, instalarlo y ejecutarlo como administrador.

image

En la página de información de los cmdlets, podemos ver un listado de comandos, veremos rápidamente que New-AzureQuickVM tiene muchas papeletas de ser el que nos ayuda a crear una máquina virtual =)  Si miramos los parámetros con Get-Help New-AzureQuickVM  y los ejemplos con Get-Help New-AzureQuickVM –examples nos hacemos una idea de los parámetros que nos van a hacer falta para ejecutar el comando, pero antes de que nos pongamos a teclear como locos hay algo que tenemos que configurar… la suscripción sobre la que queremos realizar la operación.

Estableciendo la suscripción

(Partimos de que tenemos una suscripción activa con Windows Azure y una cuenta de Azure Storage para almacenar las VMs y de que tienes powershel configurado como administrador y con el comando Set-ExecutionPolicy RemoteSigned  ejecutado)

Tenemos que decir contra qué suscripción queremos trabajar, hay diferentes formas, pero la más fácil y rápida es que ejecutemos el comando

Get-AzurePublishSettingsFile Este comando nos abrirá una sesión de navegador para que hagamos logIn con nuestro LiveId y descargará la configuración de la cuenta a un archivo .publishsettings, guardamos este archivo y nos volvemos a la consola de powershell para ejecutar el siguiente comando…

Import-AzurePublishSettingsFile PathAlArchivo.publishsettings  Que importa el archivo y establece la suscripción como ‘por defecto’

Si ahora ejecutamos el comando Get-AzureSubscription, veremos toda la configuración sobre la que vamos a trabajar, hemos de guardar la información de los apartados SubscriptionName y CurrentStorageAccount

image

 

Ahora sí, estamos preparados para ponernos a trastear con los parámetros. Para que lo tengas en cuenta, esta información se guarda en C:Users<user>AppDataRoamingWindows Azure Powershell

Revisión de los parámetros

Sistema Operativo: -Windows o –Linux … no hace falta explicarlo, no? =)

-ServiceName: Nombre del servicio, cómo lo vamos a exponer. Para probar diferentes nombres hasta que demos con uno, podemos ejecutar Test-AzureName -Service ‘nombreAProbar’ hasta que obtengamos false

-Name: Nombre que le damos a la máquina virtual

-ImageName: Tipo de máquina virtual que queremos desplegar. Podemos verlas fácilmente con Get-AzureVMImage | select ImageName  Nos mostrará las opciones que podemos escoger

ImageName
———
CANONICAL__Canonical-Ubuntu-12-04-amd64-server-20120528.1.3-en-us-30
CANONICAL__Canonical-Ubuntu-12.04-amd64-server-20120924-en-us-30GB.v
MSFT__BizTalk-Server-2010R2-CTP-3.10.77.0-07162012-en-us-50GB.vhd
MSFT__Win2K8R2SP1-Datacenter-201210.01-en.us-30GB.vhd
MSFT__Sql-Server-11EVAL-11.0.2215.0-08022012-en-us-30GB.vhd
MSFT__Windows-Server-2012-Datacenter-201210.01-en.us-30GB.vhd
OpenLogic__OpenLogic-CentOS-62-20120531-en-us-30GB.vhd
SUSE__openSUSE-12-1-20120603-en-us-30GB.vhd
SUSE__SUSE-Linux-Enterprise-Server-11SP2-20120601-en-us-30GB.vhd

-Location Aquí especificaremos en qué datacenter queremos almacenar la máquina virtual, para ver las opciones, ejecutamos Get-AzureLocation  | select DisplayName y obtenemos

DisplayName
———–
Southeast Asia
East Asia
North Central US
North Europe
West Europe
West US
East US

-InstanceSize: Tamaño de la instancia… ExtraSmall en mi caso

-Password: La password de administrador para cuando nos queramos conectar

(Puedes obtener información extendida de los parámetros en la página del cmdlet)

 

Ahora, el script completo…

PS c:>$vmImage = "MSFT__Windows-Server-2012-Datacenter-201210.01-en.us-30GB.vhd"
PS c:>$location = "North Europe"
PS c:>$adminpwd = "Passw0rd1"   …no, no se me ha escapado es un pass típico de laboratorio práctico ^^
PS c:>New-AzureQuickVM -Windows -ServiceName "dscriptSvc4" -Name "dscriptwin3" -ImageName $vmimage -Password $adminpwd -InstanceSize ExtraSmall -Location $location

image

Y la prueba en el portal de administración 😉

image

y conectado a la  máquina por terminal remoto

image

 

Scripts de Powershell…

…son todo un juguete y puedes hacer de todo con ellos, solo tienes que mirar la lista. Así que si vas a trabajar de forma intensa con algún servicio de Windows Azure, te recomiendo que inviertas algo de tiempo y te crees tus scripts de administración personalizados, te aviso de que no te fíes demasiado de los ejemplos que hay por internet… Windows Azure avanza rápidamente y algunos ejemplos se quedan atrasados rápidamente (no cuentan con tantas imágenes por ejemplo) Así que verifica los valores de los comandos ANTES de ejecutarlos

 

Happy Hacking

David Salgado (@davidsb)

Publicar website en Azure desde Visual Studio

En este post voy a reproducir el paso a paso de la demo de publicación en Windows Azure que hice en el #estechday. En la demo publicaba un sitio web que había desarrollado desde 0 a un website en un datacenter de Microsoft (Windows Azure). Inténtalo que no es difícil!

 

Desarrollar el sitio web

…porque algo tendremos que publicar, no? De todos modos nos vale con cualquier cosa, así que por ejemplo, desde Visual Studio, crea un nuevo proyecto, selecciona ASP.NET MVC y luego Internet Application.

image image

Compila para asegurar que no hay sorpresas y que tenemos un sitio web funcional

Activar una suscripción de prueba en Windows Azure

Sin una suscripción de prueba va a ser difícil que podamos subir la aplicación ^^’  así que nos activamos una. He escrito un minipost con los tipos de cuentas gratuitas: http://geeks.ms/blogs/dsalgado/archive/2012/11/27/probar-gratis-windows-azure.aspx 

 

Crear el espacio para el Website en Windows Azure

Una vez tenemos la suscripción activada, tenemos que ir al portal de administración para crear el espacio donde alojaremos nuestro sitio web.

Navegamos a http://windows.azure.com

En el panel de la izquierda hacemos click en New > Compute > WebSite > Quick Create

image

Con Quick Create nos permite crear algo similar a un directorio Virtual en un servidor web compartido, nos da la opción de asignar el nombre al sitio web, escoger en qué datacenter queremos que se ejecute y asociarlo a una suscripción (si es que somos administradores de varias)

image

En unos segundos se creará el sitio y podremos verlo en el panel de administración de WebSites

image

Si hacemos click sobre el nombre, iremos al panel de administración del servicio, donde podremos ver el consumo de recursos, acceder a las opciones de escalado para asignarle más recursos, configurar la publicación… etcétera A nosotros para esta demo nos interesa ir al menú de navegación de la derecha y hacer click en Download Publish Profile

image

Esta operación nos descarga un archivo q guardaremos (en mi caso en el escritorio) y que nos va a valer para que Visual Studio sepa conectarse al servidor (url, usuario, contraseña, protocolos disponibles…) para subir nuestra aplicación web

image

Una vez lo tengamos descargado estamos listos para publicar! (puedes abrirlo con el block de notas si tienes curiosidad)

 

Publicar desde Visual Studio

Vamos al Explorador de Soluciones (Ctrl + Alt + L), hacemos click con el botón derecho sobre el Proyecto MVC y escogemos Publish

image

En la ventana que aparece buscamos el archivo que nos hemos descargado previamente con el perfil de publicación

image image

 

Vemos en la segunda pantalla todos los datos para publicar y que por defecto lo hace por WebDeploy, si hacemos click en el botón Publish

Vamos viendo como se copia la información al servidor en el datacenter de Microsoft

image
Vemos que se suben todos los archivos, y cómo finalmente nos dice que está todo listo

image

Y abre un navegador para que podamos navegar por la aplicación
image

A partir de ahora, cuando estemos desarrollando y queramos subir un cambio nuevo, seguiremos los mismos pasos, sólo tenemos que ir al proyecto MVC y hacer click en Publish, para que se suban los nuevos cambios. Yo por ejemplo he cambiado algo de texto y al dar a publicar me detecta cambios en los siguientes archivos, de modo que sólo subira los cambios

image

image

 

 

Recursos adicionales

Continuous Delivery desde TFS

Cómo publicar en WebSites desde TFS (Service)

Cómo publicar en WebSites desde Git

Desplegar un WebSite con una Base de Datos

 

 

Happy Hacking!

  David Salgado

Probar gratis Windows Azure

Las suscripciones de prueba son gratis eso es, no hay coste, así q no le tengas miedo 😉

Estas suscripciones tienen una bolsa de horas gratuita, cuando la bolsa de horas se acaba, por defecto, el servicio se acaba, de modo que no incurres en gasto. Además, hay servicios, como el de WebSites que te deja tener hasta 10 sitios web gratis.

Estas son las cuentas que se pueden activar de forma gratuita:

– La free trial de propósito general, es la más reducida de todas, pero para trastear nos vale

– La asociada a una suscripción MSDN, valorada en hasta 3700$. Si trabajas con Visual Studio en tu empresa, posiblemente lo hayan adquirido junto con una suscripción MSDN, infórmate y pídeles tu número de suscripción!

– La asociada a un partner MPN, valorada en 1500$. Si, los partners de Microsoft tienen derecho a un paquete que se llama Cloud Essentials y que entre otras cosas incluye una bolsa de recursos de Windows Azure

– Para empresas dadas de alta en WebsiteSpark, valorada en 1500$. El programa para agencias web de Microsoft

– Para emprendedores dados de alta en Bizspark, valorada en 3700$

Happy Hacking!

  David Salgado (@davidsb)

PD: Esta información era parte de otro post, pero la he refactorizado y colocado en un post dedicado…

PD2: Lo que me hace pensar que al Live Writer le falta un botón como el de Visual Studio de ‘extract method’, pero que sea ‘extract post’ =P

ASP.NET SignalR

Fácil…SignalR es un API para facilitar la comunicación en tiempo real en aplicaciones web

¿Tiempo Real? ¿bidireccional? ¿Web?

Si, como sabes, HTTP es un protocolo de petición respuesta, donde la comunicación se inicia en el lado del cliente cuando hace una petición al servidor. Si en algún momento queremos saber si ha habido cambios en la información que se nos ha mostrado, tenemos que volver a pedir la misma página (recargarla / hacer F5).

Para que el usuario no tenga que refrescar a mano la información y para minimizar la cantidad de información que viaja a través de la red ý tiene que ser interpretada por el navegador, comento brevemente diferentes técnicas

AJAX.  Nos permite hacer peticiones al servidor sin tener que pedir la página completa. Podemos pedir la información desde un script Javascript en la página y añadir la información que nos devuelva el servidor dinámicamente. Mejora mucho la experiencia pero sigue necesitando de iniciativa del cliente para consultar la última información. Hay numerosas librerías que hacen muy sencillas estas peticiones desde Javascript, por ej: JQuery

HTTP Streaming / Reverse AJAX / COMET. Tras una petición del cliente al servidor, aprovechamos y no cerramos la respuesta para poder seguir inyectando información cuando queramos. Funciona, pero no deja de ser una forma de trampear el HTTP tradicional para lograr lo que queremos. y como todo hack conlleva cierta complejidad, tanto para hacerlo como para mantenerlo.

Web Sockets Una especificación bajo el paraguas de HTML5 que permite tener comunicación full duplex entre el servidor y el navegador, de modo que una vez establecida la comunicación, el servidor puede enviar información a los navegadores conectados sin que estos la hayan solicitado.

Entonces SignalR…

SignalR hace 2 cosas.

Por un lado utiliza WebSockets para hacer comunicaciones push del servidor al cliente y habilitar un escenario de web en tiempo real.

Por otro, si por configuración de clientes/servidor websockets no es una opción… el API de SignalR hace fallback a otras tecnologías sin que tengamos que adaptar el código. Ya no será real time web, pero nos abstrae de crear los patrones para otros tipos de comunicación Servidor->Browser

Esta es la cadena de fallback:  websockets –> Server Sent Events –> Forever Frame –> Ajax Long Pooling (xhr)

El API de SignalR está dividida en 2 partes Persistent Connections y Hubs, trabajan a diferente nivel de profundidad, siendo Hubs el que trabaja a un mayor nivel de abstracción. Por ejemplo, en Hubs puedes pasar tipos de datos complejos y funcionar de un modo RPC en las llamadas.

 

Demo de SignalR Hubs paso a paso

En El TechDay (#estechday) vimos una demo sencilla de cómo montar un Chat en SignalR partiendo de una aplicación MVC sencilla (un controlador y una vista). Os detallo el paso a paso por si queréis probarlo vosotros mismos:

Herramientas

Visual Studio 2012

ASP.NET 2012 Fall Update (incluye plantillas de SignalR, si no quieres instalarlo, hay q instalar SignalR con nuget  “Install-Package Microsoft.AspNet.SignalR -pre”)

Proyecto base

Crea un proyecto ASP.NET MVC sencillo, vale con que tenga un controlador y una vista, que compile y ya.

Creando la parte del servidor

Lo primero que hacemos es ponernos sobre el proyecto y botón derecho New Item, añadimos una clase de tipo Hub

image

Esta clase (MyHub1.cs si no has cambiado el nombre) es nuestra parte del servidor, la que se va a encargar de recibir los mensajes y distribuirlos entre todos los clientes conectados al chat. EL código es muy sencillo

image

  • Hub. La magia. Es la clase encargada en el servidor de abstraernos de todo, si miras su definición (F12 sobre la clase)  verás que hay una serie de métodos a los que te puedes suscribir (OnConnected, OnDisconnected, OnReconnected), la posibilidad de trabajar con grupos (IGroupManager)… vamos… cositas divertidas para jugar ^^
  • HubName Determina el nombre que utilizaremos para referenciar al proxy cliente que se conecta con el servidor.
  • EnviarAlChat Es el evento al que llamaremos desde la parte cliente para distribuir el mensaje
  • mostrarMensaje Aquí asumimos el compromiso de implementar este método en la parte cliente. Será el responsable de que el cliente de chat refleje en pantalla el mensaje que recibe del servidor ( con una actualización de otro usuario por ejemplo)

Y ya está el servidor! difícil verdad? 😉

Creando la parte cliente

Para crear el cliente vamos a editar la vista existente en la aplicación MVC, lo primero que vamos a hacer es añadir un par de referencias a scripts en la vista, tras la etiqueta <h2> por ejemplo

image

Importante: El primero de los scripts necesita que JQuery haya sido referenciado previamente. En un proyecto MVC por defecto, JQuery se referencia en la plantilla Shared_layout.cshtml así que la abrimos y nos aseguramos que JQuery se referencia ANTES del @RenderBody pq si no no encontrará la referencia 😉

image

Ahora solo queda la parte del código cliente.

Primero ponemos algunos controles HTML con los que trabajar…

image

Y añadimos la parte de Javascript para crear el proxy, hacer las llamadas e interactuar con los controles

image

  • $.connection.miChat  Es el proxy que va a gestionar la comunicación con el servidor. Es el HubName que hemos dado anteriormente
  • michat.client.mostrarMensaje Es la función que nos habíamos comprometido a implementar para que pueda ser llamada desde el servidor. Únicamente añade un List Item a una lista HTML y le incluye el mensaje que venga del servidor
  • $(’#bEnviar’).Click Definimos un gestor para el evento click del botón de la página, de modo que regoja el valor de la caja de texto $(‘#tbMensaje’).val() y lo envíe al servidor para que éste lo distribuya entre los clientes conectados michat.server.enviarAlChat(…)
  • enviarAlChat Fíjate que aqui utilizamos notación camelCase aunque en el servidor lo hayamos definido como PascalCase 😉
  • $.connectio.hub.Start() Llamada para que comience la conexión

Probándolo todo

Sólo tenemos que dar a F5 y abrir un par de instancias de navegador para que se comuniquen entre ellas y ver cómo todo funciona

image

Problemas frecuentes:

  • No definir previamente JQuery
  • Confusiones en la notación de JQuery al referenciar los elementos del DOM
  • Confusión en la nomenclatura del hub de servidor y de los métodos
  • Si falla algo vete mirando a ver qué objeto JS esta ‘undefined’ para ver en qué parte puede haberse cometido el error =)

 

Recursos

Página del API http://signalr.net/

Video de intro a SignalR en el BUILD – Building Real-time Web Apps with ASP.NET SignalR

 

Happy hacking!

  David Salgado (@davidsb)