Reto Windows Azure: Ejecutar un proceso durante la inicialización de un Rol

Las tareas de inicialización (startup tasks) son una forma sencilla de ejecutar una tarea cuando arranca un rol en Windows Azure.

¡Herramientas!

Para seguir el laboratorio y hacer el reto que os proponemos, necesitaras algunas herramientas, nada muy complicado, pero sin ellas va a ser difícil que lo sigas! :)

Visual Studio. Si ya tienes VS instalado perfecto, pero por si acaso, aquí tienes el enlace de descarga de la versión gratuita express o de la Ultimate Trial

SDK de Windows Azure. Contiene las herramientas para Visual Studio y las librerías necesarias para trabajar en proyectos de Windows Azure.

 

Si surge cualquier duda o complicación, no dudes en añadir un comentario a este post o comentárnoslo por twitter a @esmsdn o con el hashtag #retosmsdn

¿Por qué ejecutar una tarea antes de que arranque un Rol?

Imaginemos que la aplicación que hemos alojado en la nube tiene necesidades de configuración del IIS, tocar alguna rama del registro, definir variables de entorno, lanzar un script en powershell, copiar archivos, registrar componentes… Cualquiera de estas actividades tendría que poder realizarse al margen de la aplicación, para no cargar a esta con responsabilidades de infraestructura.

¿Cómo se crea una startup task?

Tenemos que editar el archivo de definición (ServiceDefinition.csdef) para definir la startup task. Al definirla tendremos que indicar qué tarea (proceso/batch file) se va a ejecutar, en qué contexto de ejecución (permisos) y el tipo de ejecución (simple, background o foreground).

Algunas consideraciones

El tipo de ejecución determinará el comportamiento la tarea como proceso con respecto del rol. Simple significa síncrono… así que el rol no arrancará hasta que la tarea no acabe de forma satisfactoria (para que devuelvan 0, en ocasiones hay que añadir un exit /b 0 al cmd). Foreground y Background correrán a la vez que el rol pero con matices.

Log, log, log…. ¿ha quedado claro? todo lo que se ejecute, que deje un archivo de log para poder depurar en caso de error.

El Remote Desktop puede ser extremadamente útil para depurar problemas con las tareas… eso sí… siempre y cuando estas sean con ejecución Foreground o Background porque si es de tipo Simple y se queda bloqueada, una de las consecuencias es que no va a arrancar el rol… y si no hay rol… no hay remote desktop ;)

Un ejemplo práctico – crear un archivo desde un script Powershell

Crear el proyecto

Arrancamos Visual Studio como administradores y creamos un nuevo tipo de proyecto cloud, en este ejercicio no vamos a implementar nada en la parte del rol, de modo que da lo mismo cuál crear, pero con un rol web, al menos tendremos el feedback del navegador abierto, así que creamos un nuevo rol web.

image

 

Crear las tareas

Para crear las tarea es preferible hacerlo en un block de notas a hacerlo en el Visual Studio, parece ser que el Visual Studio añade una serie de bytes al principio de los archivos que hacen que no se ejecuten correctamente.

No hay mayor problema, creamos un par archivos con el block de notas y los guardamos en la raíz del proyecto recién creado.

image

startup.cmd

@echo off powershell -command "Set-ExecutionPolicy Unrestricted" >> err.out powershell ./CreateFile.ps1 >> err.out

CreateFile.ps1

New-Item hola.txt -type file -value "hola task"

Importante. No hay que olvidarse de especificar que los archivos deberán copiarse al directorio Output, si no, no habrá despliegue de los scripts con la aplicación y por lo tanto no se subirán al servidor.

image    image 

Referenciar las tareas en el archivo de descripción

Con las tareas ya creadas, es el momento de editar el archivo ServiceDefinition.csdef e incluir la <task> inicial

<WebRole name="AzureStartupTask"> <Startup> <Task commandLine="startup.cmd" executionContext="elevated" taskType="background"/> </Startup> <Sites> <Site name="Web"> <Bindings> …

Lanzamos y comprobamos resultados

Una vez hemos creado el script y lo hemos referenciado con la tarea… arrancamos la aplicación desde Visual Studio y una vez esta el navegador arrancado y funcionando, nos vamos a la carpeta que simula el almacenamiento. En mi caso es:

C:\Users\davidsb\Desktop\<NombreSolución>\StartupTasks\StartupTasks\bin\Debug\StartupTasks.csx\roles\Frontal StartupTask\approot\bin

Si todo ha salido bien, tendremos un nuevo fichero “hola.txt

image

y si no… un maravilloso “err.out” para depurar los posibles errores en los scripts :)

image

Tu turno… ¡el Reto! – consola de comandos

Te proponemos como reto que crees una startup task que al ejecutarse lance una consola de comandos sobre la que poder interactuar (cmd.exe) y que hasta que no se cierre la consola, que no arranque el rol

Pistas: … nahhh este es fácil… pistas para otros más complicados ;)

Solución: En una semana enlazaremos la solución desde este post (y publicaremos un nuevo artículo/reto).

No dudéis en dejar comentarios, dudas … en este post, estaremos monitorizándolo para responder cuanto antes.

Happy Hacking!

David Salgado – @davidsb – Technology Evangelist