En el post anterior comentaba el error que surge al intentar acceder a SQL Azure, el cual fue actualizado en el mes de Julio. Siguiendo los pasos del artículo conseguimos continuar trabajando con SMO en local pero, para poder trabajar desde Windows Azure con SMO debemos acondicionar las máquinas virtuales antes de prestar servicio.
Desde SQL Azure Labs nos facilitan los dos paquetes necesarios para instalar la versión SQL Server «Denali», la cual está aún en CTP, que son SQLSysClrTypes.msi y SharedManagementObjects.msi.
Una vez que hemos descargado ambos paquetes, los adjuntamos en el raíz del rol que va a hacer uso de SMO.
Para poder instalar estos dos paquetes utilizaremos la sección Startup para que las máquinas sean acondicionadas justo antes de comenzar a prestar servicio. El proceso de instalación debe ser en modo silencioso o desatendido, por lo que utilizaremos el siguiente bat para conseguirlo:
if "%EMULATED%"=="true" goto :EOF msiexec /i SQLSysClrTypes.msi /qn /l* install_SQLSysClrTypes.txt msiexec /i SharedManagementObjects.msi /qn /l* install_SharedManagementObjects.txt
La primera línea que se muestra en el código anterior se trata de una comprobación recogida en el blog de Steve Marx con la que podremos controlar si nos encontramos en un entorno simulado, es decir en local, o bien en la nube. Con ello evitaremos la instalación de estos paquetes una y otra vez cuando nuestro desarrollo lo estemos ejecutando en un entorno no-cloud.
Las dos líneas siguientes harán uso del comando msiexec para lanzar la instalación de ambos paquetes. Con el parámetro qn conseguiremos que las mismas sean instalaciones silenciosas o desatendidas y sin una UI con la que interactuar.
Nota: Los tres paquetes deberán tener la propiedad Copy to Output Directory a Copy Always o Copy if newer.
Una vez establecido qué es lo que queremos subir, vamos a definir nuestra tarea en el archivo de definición de Windows Azure. El mismo tendrá un aspecto similar al siguiente:
<?xml version="1.0" encoding="utf-8"?> <ServiceDefinition name="SMO" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WebRole1" vmsize="Small"> <Startup> <Task commandLine="installsmo.bat" executionContext="elevated"> <Environment> <Variable name="EMULATED"> <RoleInstanceValue xpath="/RoleEnvironment/Deployment/@emulated" /> </Variable> </Environment> </Task> </Startup> <Sites> <Site name="Web"> <Bindings> <Binding name="Endpoint1" endpointName="Endpoint1" /> </Bindings> </Site> </Sites> <Endpoints> <InputEndpoint name="Endpoint1" protocol="http" port="80" /> </Endpoints> <Imports> <Import moduleName="Diagnostics" /> <Import moduleName="RemoteAccess" /> <Import moduleName="RemoteForwarder" /> </Imports> </WebRole> </ServiceDefinition>
El atributo commandLine tendrá como valor el nombre del archivo bat desde el cual ejecutamos los paquetes, el executionContext será elevated para tener permisos de administrador y, por último, se ha creado una variable de entorno donde obtendremos el valor del xpath /RoleEnvironment/Deployment/@emulated. Existen varios xpath que podemos utilizar para facilitar nuestras tareas. Podéis encontrarlos en el siguiente enlace.
¡Ya estamos listos para subir el proyecto a la nube! Publicamos el mismo y esperamos a que nuestras máquinas muestren el estado Ready. Para comprobar que la tarea se ha completado con éxito podemos acceder a través de acceso remoto a alguno de los nodos del rol y comprobar que los paquetes han quedado instalados en el sistema operativo:
Espero que haya sido de utilidad 😀
¡Saludos!