Windows Azure Companion

Una de las ventajas más importantes de la plataforma Windows Azure es que no sólo nos permite ejecutar nuestras aplicaciones web en .NET en la nube sino que además podemos desplegar cualquier aplicación web en cualquier lenguaje :D

En este post voy a centrarme en todos aquellos CMS por excelencia implementados en PHP: Drupal, Joomla y WordPress. Si bien podemos adaptarlos de forma manual utilizando el Web role de FastCGI, me gustaría mostraros una forma mucho más sencilla y con un entorno de administración muy útil gracias a Windows Azure Companion :)

¿Qué es Windows Azure Companion?

WAC se trata en realidad de una solución cloud debidamente preparada para la instalación y ejecución de aplicaciones PHP.

Como podemos ver en la imagen, el modo de proceder es bastante simple:

  1. Descargamos el paquete y el archivo de configuración de Windows Azure Companion.
  2. Establecemos los valores de configuración.
  3. Desplegamos el paquete.
  4. Elegimos las aplicaciones que queremos instalar.

Descarga de los paquetes de Windows Azure Companion

Actualmente, con la última release del mes de diciembre, tenemos varios tipos de descargas:

Tanto el primero como el segundo se tratan de los paquetes de despliegue con la única diferencia de que el segundo de ellos tiene configurados los endpoints necesarios para HTTPS. Por otro lado, ambos están pensados para ser ejecutados en una máquina virtual small.

Si necesitáramos cambiar algo más específico o simplemente modificar el tamaño de la máquina virtual por uno mayor, disponemos de un tercer paquete que contiene el código fuente.

En este post vamos a descargar el primero de ellos.

Configuración

Para poder hacer uso de esta aplicación, es necesario tanto un Hosted Service como una Storage Account, además de una o varias bases de datos, dependiendo del número de CMS que queramos instalar. 

Abrimos el archivo ServiceConfiguration.cscfg el cual muestra el siguiente aspecto:

<?xml version="1.0" encoding="utf-8"?>
<!--
  **********************************************************************************************

  This file was generated by a tool from the project file: ServiceConfiguration.cscfg

  Changes to this file may cause incorrect behavior and will be lost if the file is regenerated.

  **********************************************************************************************
-->
<ServiceConfiguration serviceName="WindowsAzureCompanion" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="1" osVersion="*">
  <Role name="AdminWebSite">
    <!-- Do not increase the instance count. Windows Azure Companion does not support more than 1 instances -->
    <Instances count="1" />
    <ConfigurationSettings>
      <!-- Application Details. Title and Welcome text -->
      <Setting name="ApplicationTitle" value="Windows Azure Companion" />
      <Setting name="ApplicationDescription" value="&lt;p&gt;The &lt;span class=&quot;textlink&quot;&gt;&lt;a href=&quot;http://www.microsoft.com/windowsazure/windowsazure&quot;&gt;Windows Azure platform&lt;/a&gt;&lt;/span&gt; is a cloud platform that allows applications to &#xD;&#xA;      be hosted and run at Microsoft datacenters. It provides a cloud operating system called Windows Azure that serves as the &#xD;&#xA;      runtime for the applications and provides a set of services that allow development, management and hosting of applications.&lt;/p&gt;&#xD;&#xA;      &#xD;&#xA;      &lt;p&gt;With its standards-based and interoperable approach, the Windows Azure platform supports multiple Internet protocols including &#xD;&#xA;      HTTP, XML, SOAP and REST. As an open platform, the Windows Azure platform allows developers to use multiples languages &#xD;&#xA;      (.NET, Java, and PHP &amp; other dynamic languages ) to build applications which run on Windows Azure and/or consume any of the &#xD;&#xA;      Windows Azure platform offerings.&lt;/p&gt;&#xD;&#xA;      &#xD;&#xA;      &lt;p&gt;The Windows Azure Companion aims to provide a seamless experience for deploying platform-level components as well as applications &#xD;&#xA;      on to Windows Azure. The first community preview of the Windows Azure Companion has been tested with PHP runtimes, frameworks, &#xD;&#xA;      and applications. However, the system may be extended to be used for deploying any component or application that has been tested &#xD;&#xA;      to run on Windows Azure.&lt;/p&gt;" />
      <!-- Windows Azure Storage Account Details. -->
      <Setting name="WindowsAzureStorageAccountName" value="ACCOUNT NAME" />
      <Setting name="WindowsAzureStorageAccountKey" value="PRIMARY ACCESS KEY" />
      <!-- Admin user name, password and e-mail. Please user strong username and password -->
      <Setting name="AdminUserName" value="USERNAME" />
      <Setting name="AdminPassword" value="PASSWORD" />
      <!-- Atom Feed for Product items to be installed. This URL should be internet addressable -->
      <Setting name="ProductListXmlFeed" value="http://wazstorage.blob.core.windows.net/azurecompanion/default/WindowsAzureCompanionFeed.xml" />
      <!-- Settings for Windows Azure Drive used for durability -->
      <Setting name="PHPApplicationsBackupContainerName" value="companionv2" />
      <Setting name="InstallationStatusConfigFileBlob" value="status.xml" />
      <Setting name="ProgressInformationFileBlob" value="progress.xml" />
      <Setting name="XDrivePageBlobName" value="backup.vhd" />
      <Setting name="XDriveSizeInMB" value="2000" />
      <!-- Max value is defined as 500 in ServiceDefinition.csdef file (XDriveLocalCache Local Resource) -->
      <!-- Windows Azure Drive size is defined in ServiceDefinition.csdef. Look for ApplicationsAndRuntimeResource -->
      <Setting name="XDriveCacheSizeInMB" value="500" />
      <!-- Diagnostics and Performance Counter Capture Frequency in minutes -->
      <Setting name="DiagnosticsAndPerformanceCounterCaptureFrequencyInMinutes" value="1" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

Los valores obligatorios que debemos modificar son:

  • Windows Azure Storage Account Name: Podemos localizar este nombre en las propiedades de la storage account que vayamos a utilizar.

  • Windows Azure Storage Account Key: Se refiere a la clave primaria de la cuenta de storage, también en las propiedades en el portal.
  • AdminUserName y AdminPassword para el acceso a la parte de administración.
  • ProductListXMLFeed: Se trata de un XML donde están registrados todos los repositorios que tenemos disponibles para instalarlos a través de la plataforma. Por defecto he dejado indicado el propio del autor pero podemos añadir uno propio.

Despliegue

Para el despliegue, basta con acceder a través del portal de Windows Azure y crear un nuevo deployment en uno de los dos entornos del Hosted Service.

Una vez iniciado el servicio ¡Ya podemos comenzar a instalar CMS :D!

 

Instalación de aplicaciones

Gracias a la nueva característica FullIIS anunciada en el PDC 2010, esta aplicación está configurada poder generar diferentes sitios dentro del mismo role. 

Para poder instalar los CMS,  debemos acceder a nuestra URL a través del puerto 8080, el cual ha sido establecido para las labores de administración. Por ejemplo:

http://serviceName.cloudapp.net:8080

Nos logamos con las credenciales establecidas en el archivo ServiceConfiguration.cscfg para poder acceder a los apartados Platform y Applications.

Espero que sea de utilidad :)

¡Saludos!

Creación de un vhd para arrancarlo en modo nativo

 

Ayer me encontré con la necesidad de montar un Windows Server 2008 R2 en 64 bits. Ya que virtual PC no soporta imágenes en 64 bits y Virtual Box me daba problemas al querer instalar Hyper-V he decidio una solución con un gran rendimiento a la par que elegante: Montar un disco duro virtual (vhd) para poder arrancarlo en modo nativo  :D 

¿Qué necesitamos?

Creación del VHD

Lo primero que vamos a hacer es crear un disco duro virtual donde vamos a instalar posteriormente Windows Server 2008 R2 de 64 bits. Para ello, accedemos a la consola de comandos como administrador y ejecutamos lo siguiente: 

diskpart
create vdisk file=c:Win2K8R2x64.vhd maximum 40960
sel vdisk file=c:Win2k8R2x64.vhd
attach vdisk
list disk

 

Con el apartado anterior estamos creando un disco duro virtual de 40GB y lo montamos en el sistema. El siguiente paso será crear una partición y formatearla en NTFS para poder trabajar con el vhd. 

sel disk 2
create part primary
sel part 1
active
format fs=ntfs quick
assing

Instalación de Windows Server 2008 R2 64 Bits en el VHD

Una vez que tenemos el vhd montado y formateado ya podemos instalar el sistema operativo. Para ello necesitamos instalar The Windows® Automated Installation Kit (AIK) for Windows® 7. Accedemos a la consola de comandos de AIK a través de Inicio => Todos los programas => Microsoft Windows AIK => Deployment Tools Command Prompt como administrador. 

ImageX /apply c:en_windows2008_r2_x64sourcesinstall.wim 3 /check F:

Si desglosamos los parámetros de este comando analizamos lo siguiente: 

  • Imagex /apply nos dice la acción que vamos realizar. Este comando se utiliza para aplicar imágenes en HDs y VHDs.
  • c:en_windows2008_r2_x64sourcesinstall.wim es la ubicación del archivo .wim que es la imagen que queremos aplicar.
  • El 3 se utiliza para decir cuál de las imagenes queremos utilizar de las disponibles dentro del archivo wim. En el caso del DVD de Windows Server 2008 R2 de 64 bits disponemos de varias imágenes:
    1. Windows Server 2008 R2 Standard (Full Installation)
    2. Windows Server 2008 R2 Standard (Server Core Installation)
    3. Windows Server 2008  R2 Enterprise (Full Installation)
    4. Windows Server 2008 R2 Enterprise (Server Core Installation)
    5. Windows Server 2008 R2 Datacenter (Full Installation)
    6. Windows Server 2008 R2 Datacenter (Server Core Installation)
    7. Windows Web Server 2008 R2 (Full Installation)
    8. Windows Web Server 2008 R2 (Server Core Installation)

    En este post instalaremos la versión Enterprise, la cual ocupa el tercer lugar. 

  • /check es un parámetro opcional para comprobar la integridad del archivo install.wim.
  • F: se trata de la unidad asignada a nuestro VHD.

Más información sobre ImageX 

Registrar el vhd en boot.ini

Como último paso debemos registrar el vhd en el boot para poder seleccionarlo en el menú durante el arranque.
En primer lugar, volvemos a la línea de comandos y desmontamos el vhd del sistema. 

diskpart
select vdisk file=c:Win2K8R2x64.vhd
detach vdisk
exit

Para registrar el nuevo disco, utilizamos el comando bcdedit a través de la línea de comandos: 

bcdedit /copy {current} /d "Windows Server 2008 R2 64 bits – VHD Boot"
bcdedit /set {nuevo_GUID} device vhd=[C:]Win2K8R2x64.vhd
bcdedit /set {nuevo_GUID} osdevice vhd=[C:]Win2K8R2x64.vhd
bcdedit /set {nuevo_GUID} detecthal on

Espero que sea de utilidad :D 

¡Saludos!

Leer archivos XML con JQuery

Desde que JQuery llegó a nuestras vidas, Javascript se ha convertido en un camino de rosas :D Tanto es así que en pocas líneas podemos conseguir el parseo completo de un archivo XML ¡Vamos a verlo!

En primer lugar hay que aclarar que podemos toparnos principalmente con tres formatos de XML diferentes:

  1. Utilizando atributos: Cada elemento guarda su información dentro de atributos. Los atributos deberían utilizarse para información predeterminada, metadatos, archivos grandes (los atributos tienden a ocupar menos bytes que los elementos).
    <?xml version="1.0" encoding="utf-8" ?>
    <Blogs>
      <blog name="WebLog Expert - Powerful log analyzer"
            description="Download and analyze Apache and IIS Web logs on your own PC."
            url=" http://www.weblogexpert.com/"/>
      <blog name="Professional drupal themes"
            description="For professional drupal themes with a unique look and feel, visit TopNotchThemes.com."
            url="http://www.topnotchthemes.com/"/>
      <blog name="Paypal Developer Community"
            description="The community for developping paypal payment processing scripts."
            url="http://www.pdncommunity.com" />"
    </Blogs>
  2. Utilizando nodos/elementos: Los elementos contienen a su vez otros elementos llamados nodos. Se suelen utilizar para almacenar datos.
    <?xml version="1.0" encoding="utf-8" ?>
    <Blogs>
      <blog>
        <name>WebLog Expert - Powerful log analyzer</name>
        <description>Download and analyze Apache and IIS Web logs on your own PC.</description>
        <url>http://www.weblogexpert.com/</url>
      </blog>
      <blog>
        <name>Professional drupal themes</name>
        <description>For professional drupal themes with a unique look and feel, visit TopNotchThemes.com.</description>
        <url>http://www.topnotchthemes.com/</url>
      </blog>
      <blog>
        <name>Paypal Developer Community</name>
        <description>The community for developping paypal payment processing scripts.</description>
        <url>http://www.pdncommunity.com</url>
      </blog>
    </Blogs>
  3. Mezcla de los dos anteriores.

Dependiendo del cómo esté almacenado utilizaremos un método u otro para recuperarlo.

Recuperación de atributos

//Read attributes

$.get("Attributes.xml", function (xml) {
    $(xml).find("blog").each(function () {

       var name = $(this).attr('name');
       var description = $(this).attr('description');
       var url = $(this).attr('url');

       alert(name + " " + description + " " + url);
    });
});

Recuperación de nodos/elementos


//Read nodes
  $.get("Nodes.xml", function (xml) {
    $(xml).find("blog").each(function () {
       var name = $(this).find('name').text();
       var description = $(this).find('description').text();
       var url = $(this).find('url').text();

       alert(name + " " + description + " " + url);
    });
});

Lo que estamos haciendo en ambos casos es una iteración a través de each por cada elemento blog que tengamos en el archivo. Dependiendo del tipo que esperemos utilizaremos attr para recuperar los atributos y find para los elementos.

Espero que sea de utilidad :)

¡Saludos!