Usa Vagrant con Microsoft Azure

Desde hace varios días, he estado jugando con Vagrant, la popular herramienta que te permite crear cualquier entorno basado en máquinas virtuales de una manera rápida y replicable. Es un proyecto open source compatible con Windows, Mac y Linux y que realmente facilita la vida del desarrollador, preocupándose únicamente por lo que realmente importa: la aplicación. En la página oficial de Vagrant puedes comprobar que existen distintos proveedores (dónde se van a crear tus máquinas virtuales): Virtual Box, VMware, Docker y AWS. Por supuesto, también existe uno para Microsoft Azure y en este post te voy a mostrar cómo instalarlo y crear una máquina virtual sobre Azure utilizando Vagrant.

Si todavía no la utilizas, instala Vagrant desde el apartado del downloads del sitio oficial. Para este post he utilizado Mac OS X como sistema operativo. Una vez instalado, abre un terminal y comprueba que funciona lanzando el comando vagrant.

Vagrant command

Lo siguiente es instalar el provider para Azure. No necesitas nada más que ejecutar el siguiente comando desde la propia consola para que comience la instalación:

vagrant plugin install vagrant-azure

A partir de aquí, ya puedes comenzar a diseñar tu proyecto. Crea una carpeta llamada azure_proyect y accede a ella para que sea la ubicación del mismo.

mkdir azure_proyect
cd azure_proyect

Una vez ahí puedes comenzar a configurar tu box. Desde la página de GitHub del provider se ofrece un box dummy que te dará el esqueleto del archivo Vagrantfile, que será el que describa el tipo de máquina que vas a configurar. Lanza el siguiente comando para solicitar la box:

vagrant box add azure https://github.com/msopentech/vagrant-azure/raw/master/dummy.box

Por último, para obtener el archivo necesario para configurar tu proyecto lanza vagrant init a continuación.

vagrant init

Si accedes a la carpeta donde definiste tu proyecto de Vagrant (desde el terminal > open .) podrás ver que ya está disponible el archivo Vagrantfile que necesitas para configurar tus credenciales de azure, cómo va a ser tu máquina virtual, qué imagen vas a utilizar, etcétera.

Vagrant file

Modifica el archivo para reemplazar el contenido con lo siguiente:

Vagrant.configure('2') do |config|
 config.vm.box = 'azure'

 config.vm.provider :azure do |azure, override|
 # Mandatory Settings 
 azure.mgmt_certificate = 'YOUR_CERTIFICATE.pfx'
 azure.mgmt_endpoint = 'https://management.core.windows.net'
 azure.subscription_id = 'YOUR_SUBSCRIPTION_ID'
 azure.vm_image = 'b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-15_04-amd64-server-20150224.5-beta1-en-us-30GB'
 azure.vm_name = 'ubuntugise' # max 15 characters. contains letters, number and hyphens. can start with letters and can end with letters and numbers

 # vm_password is optional when specifying the private_key_file with Linux VMs
 # When building a Windows VM and using WinRM this setting is used to authenticate via WinRM (PowerShell Remoting)
 azure.vm_password = 'YOUR_PASSWORD' # min 8 characters. should contain a lower case letter, an uppercase letter, a number and a special character

 # Optional Settings
 #azure.storage_acct_name = 'NAME OF YOUR STORAGE ACCOUNT' # optional. A new one will be generated if not provided.
 #azure.vm_user = 'PROVIDE A USERNAME' # defaults to 'vagrant' if not provided
 #azure.cloud_service_name = 'PROVIDE A NAME FOR YOUR CLOUD SERVICE' # same as vm_name. leave blank to auto-generate
 #azure.deployment_name = 'PROVIDE A NAME FOR YOUR DEPLOYMENT' # defaults to cloud_service_name
 azure.vm_location = 'West Europe' # e.g., West US

 # Optional *Nix Settings
 #azure.ssh_port = 'A VALID PUBLIC PORT' # defaults to 22
 #azure.private_key_file = 'Path to your ssh private key file (~/.ssh/id_rsa) to use for passwordless auth. If the id_rsa file is password protected, you will be prompted for the password.'

 # Optional Windows Settings
 #azure.winrm_transport = [ 'http', 'https' ] # this will open up winrm ports on both http (5985) and http (5986) ports
 #azure.winrm_https_port = 'A VALID PUBLIC PORT' # customize the winrm https port, instead of 5986
 #azure.winrm_http_port = 'A VALID PUBLIC PORT' # customize the winrm http port, insted of 5985
 #azure.tcp_endpoints = '3389:53389' # opens the Remote Desktop internal port that listens on public port 53389. Without this, you cannot RDP to a Windows VM.
 end
end

He dejado todos los valores opcionales comentados, para que puedas ver de un vistazo todo lo que se puede configurar. Ahora nos centraremos en aquellos que son obligatorios para ti en esta primera prueba con Vagrant y Azure. Según el script anterior, necesitamos varios parámetros obligatorios:

  • azure.mgmt_certificate: se trata del certificado para conectar con tu suscripción de Microsoft Azure. Puede estar en formato PEM, PFX  o raw string. Para hacerlo fácil, descargate el archivo de publicación de tu cuenta de Microsoft Azure desde aquí.
    <?xml version="1.0" encoding="utf-8"?>
    <PublishData>
      <PublishProfile SchemaVersion="2.0" PublishMethod="AzureServiceManagementAPI">
        <Subscription ServiceManagementUrl="https://management.core.windows.net" Id="THIS IS YOUR SUBSCRIPTION ID" Name="THIS IS YOUR SUBSCRIPTION NAME" ManagementCertificate="THIS IS YOUR CERTIFICATE" />
      </PublishProfile>
    </PublishData>

    La forma más sencilla es utilizando ruby para generar el pfx a través de este archivo. Para ello asegurate de que tienes instalada la librería azure a través del siguiente comando:

    gem install azure -v 0.7.0

    Con pfxer puedes generar un pfx con la información del archivo publish settings de la siguiente forma:

    pfxer transform --in PATH_PUBLISH_SETTINGS
  • azure.mgmt_endpoint: El valor que se necesita es el que figura (https://management.core.windows.net), que es el endpoint de las APIs de administración, por lo que no es necesario cambiarlo.
  • azure.subscription_id: Se trata del id de tu suscripción, que puedes localizarlo en archivo anterior.
  • azure.vm_image: Nombre de la imagen dentro del repositorio de Microsoft Azure que vas a utilizar. Utilizando Azure CLI puedes recuperar el nombre de las imágenes que puedes usar:
    azure vm image list

    No te asustes, ya sé que la lista es interminable. Puedes filtrarlas utilizando algo como lo siguiente:

    azure vm image list | grep "Ubuntu-15_04"

    Para este artículo voy a utilizar la que tiene el nombre b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-15_04-amd64-server-20150224.5-beta1-en-us-30GB.

  • azure.vm_name: nombre de tu máquina virtual.
  • azure.vm_password: contraseña del administrador.
  • azure.vm_location: la región donde quieres desplegar tu máquina.

Una vez que hayas configurado todos los parámetros, bastará con lanzar el comando vagrant up para crear tu nueva máquina virtual a través de Vagrant:

vagrant up

vagrant up provider azure

Una vez que el proceso de creación haya terminado, podrás comunicarte con tu nueva máquina virtual a través de vagrant ssh.vagrant ssh

Para completar el ciclo, cuando hayas terminado de trabajar con la misma, podrás eliminarla a través del comando vagrant destroy.

vagrant destroy azure

¡Saludos!