Windows Azure BigMuy buenas,

Cuando es necesario que una de nuestras aplicaciones a desplegar en Azure cuente con algún prerrequisito, Toolkit, SDK Adicional, etc., para que todo funcione correctamente, Azure cuenta con las “Startup Task”, que  seguro que ya conocéis.  Nuestra compañera Gisela ya lo comentó en un post hace ya un tiempo. No obstante, aunque las nociones son estas, existen algunos matices que me gustaría comentar:

Recordemos que estas tareas son necesarias, porque Windows Azure puede decidir en cualquier momento por cuestiones de mantenimiento (transparente para nosotros, eso sí), hacer un movimiento de la maquina  que contiene nuestro role, en cuyo caso si hemos optado por instalar manualmente algunos de estos prerrequisitos, perderíamos dicha configuración y nuestra aplicación dejaría de funcionar si aviso previo.

Para evitar esto necesitaremos configurar las “Startup task” como resumo a continuación:

  • Incluimos en el fichero “ServiceDefinition.csdef” la sección “Startup”:
   1: <WorkerRole name="ElGuerreWorkerRole" vmsize="Small">

   2:     <Startup>

   3:       <Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple">

   4:       </Task>

   5:     </Startup>

   6: ...

  • Situamos el instalable en cada uno de los proyectos (.csproj)  que serán un role de Azure y, establecemos el valor la propiedad “Copy to Output Directory” con el valor  “Copy Allways”.
  • Incluimos también un “.cmd” para indicar las ordenes de instalación que instalaran nuestro instalable y, nuevamente “Copy Allways
  • Al llevar a cabo estas “tasks” podemos encontrarnos con los siguientes tipos:
    • .msi
    • .exe
    • .msu
  • Además del tipo de instalable es muy importante conocer la plataforma a la que este va destinado:
    • Windows  Server 2008 sp2
    • Windows Server 2008 R2

Recordemos también que   por defecto un role de Windows Azure se despliega como Windows Server 2008 Sp2 así que para que en su lugar este sea “R2”  tenemos que establecer el valor de la propiedad  como osFamily="2"  en del fichero de configuración “.cscfg”.

A continuación un ejemplo para la instalación de WIF necesaria para la conexión con CRM OnLine:

  • Creamos “Startup.cmd” para Windows Server 2008 sp2:

1: @echo off

   2: sc config wuauserv start=demand

   3: wusa.exe "%~dp0Windows6.0-KB974405-x64.msu" /quiet /norestart               

   4: sc config wuauserv start=disabled

   5: exit /b 0

  • Para Windows Server 2008 R2 habría que modificar el “0” por un “1”  en la línea 3 del script anterior además de, osFamily=”2”:
   1: wusa.exe “%~dp0Windows6.1-KB974405-x64.msu”

 

Adicionalmente, para incluir  “.dll” en la “gac” es necesario proceder de la misma manera:

  1. Incluir el fichero “gacutil.exe” en nuestro proyecto (.csprog)  y, “Copy Allways”.
  2. Crear un “.cmd” con la instrucción adecuada y “Copy Allways”:
   1: gacutil /nologo /i .\Microsoft.IdentityModel.dll 

   2: exit /b 0

Importante: Es necesario seguir los siguientes pasos para guardar los  scripts “.cmd” y que este sea legible por el SSOO y principalmente para evitar problemas durante el deploy. Parece que esto es debido a un “issue / bug” !!!

image

image

image

La “recomendacion” en este post, es incluir nuestros instalables en un directorio“setup” dentro de cada proyecto “.csproj” (Role de Azure)  e indicar esteen la propiedad commandLine de nuestra “Task”. Asi todo estará un poco más organizado:

   1: <Task commandLine="setup\startup.cmd" executionContext="elevated" />

Aquí os dejo un muy buen enlace que también nos guía y llega a profundizar un poco más, y otro más, que incluye ejemplos con PowerShell.

Un camino más ágil, nunca viene mal, ¡seguro que no! Guiño

Saludos

Juanlu @Higuera la Real