Máquina virtual automatizada para programar con python y Django

A continuación indico unas anotaciones para montar una pequeña infraestructura para usar Django.

Para empezar a usar Python y Django, podemos instalarlo en el sistema (a través de apt-get o pip/easy_install), usarlo a través de entornos virtuales (virtualenv), etc Pero vamos a ir un poco más allá de los sistemas, y vamos a montarnos un entorno de desarrollo virtual.

No voy a ponerme a instalar un Ubuntu paso a paso. ¿qué pereza, no? Vamos a usar para ello: Vagrant junto con Chef

La idea general, es crear una maquina virtual con nuestras necesidades: en este caso: Python y Djando lista para ser usada. Para esta tarea, haremos uso de Vagrant y Chef-solo que nos permitirán, a través de un fichero la configuración, la configuración específica del sistema, y automágicamente se creará el sistema, ésta y todas las veces que quedamos.

Por dónde empezamos:

  • Instalamos Vagrant en nuestro sistema
  • Creamos una carpeta donde almacenar nuestras maquinas (En un alarde de originalidad, le he llamado «vagrant») y posteriormente, una carpeta por maquina. En este caso, «djangoguide»
  • Dentro del directorio «vagrant/djangoguide» “inicializamos” el directorio de Vagrant con un:
    vagrant init

    y se crea un directorio con el fichero Vagrantfile que será donde se indica la configuración de la máquina virtual a crear. Procedemos a realizar algunas modificaciones del fichero VagrantFile acorde a nuestras necesidades:

  • [Fichero VagrantFile propuesto basada en la configuración estándar y la propuesta de fichero simplificado gracias a Juanje Ojeda]

    # -*- mode: ruby -*- 
    # vi: set ft=ruby :
     
    Vagrant::Config.run do |django_conf|
        # Nombre logico de la imagen a partir de la que se crea la maquina virtaul.
        django_conf.vm.box = "lucid64"
     
        # URL desde donde se descarga la imagen de la maquina virtual con el nombre
        # indicado en config.vm.box.  Solo se usa en el caso de no existir la maquina a crear.
     
        django_conf.vm.box_url = "http://files.vagrantup.com/lucid64.box"
     
        # Asignar una ip a la mv. En este caso, no es necesario los redireccionamiento
        # config.vm.network :hostonly, "10.0.33.10"
     
        # Redireccionamientos de puertos desde dentro de la maquina
        # Esto permite acceder al puerto 8000 (donde se suele lanzar django por defecto) 
        # a traves del puerto 8001 desde fuera.
     
        django_conf.vm.forward_port 8000, 8001
     
        # Lo siguiente, permite hacer el «provisionamiento» a Chef-solo
        # indicandole los cookbook que queremos que esten disponibles
        # en nuestro nueva maquina virtual
     
        django_conf.vm.provision :chef_solo do |chef|
          ## Path relativo a este fichero
            chef.cookbooks_path = "cookbooks"
            chef.add_recipe "apt"
            chef.add_recipe "build-essential"
            chef.add_recipe "vim"
            chef.add_recipe "python"
            chef.add_recipe "django"
        end 
        # Es interesante compartir código con la maquina virtual. Lo vamos a hacer
        # a traves una carpeta compartida. En este caso, mi carpeta con los repos
        # de git. En la maquina virtual, estan accesibles en /opt/git
        # Todos los cambios en esa carpeta, son visibles dentro y fuera de la vm. 
     
        django_conf.vm.share_folder "git","/opt/git","/home/anarey/git/djandoapps"
    end
  • Del fichero Vagrantfile se puede destacar:
    • Configuración correspondiente a la maquina virtual y a partir de que imagen se va a crear
    • Información sobre la redirección de puertos realizado para los posteriores servicios que se monten.
    • Configuración especifica referencia al software a instalar y configuraciones. Esto se hace a través de chef-solo y un conjunto de Cookbooks que se le indica
  • Nos descargamos los cookbooks que hemos indicados. Los cookbooks son libros de recetas, es decir, un conjunto de directorios y ficheros con instrucciones donde se indica cierto software a instalar/configurar en nuestro sistema. Como se indica, vamos a instalar después de la creación de la maquina virtual: apt, apache2 con el módulo mod_wsgi,built-essential, git, vim, django.

    Obtener los cookbooks necesarios y creamos una carpeta dentro de nuestro directorio «vagrant/djangoguide» llamado cookbooks.

    git clone git://github.com/opscode-cookbooks/apt.git
    git clone git://github.com/opscode-cookbooks/build-essential.git
    git clone git://github.com/opscode-cookbooks/python.git
    git clone git://github.com/opscode-cookbooks/vim.git

    Cuidado: El directorio «cookbooks» debe coincidir con el indicado en el directorio Vagrantfile (ruta relativa a la localización de el fichero Vagrantfile) «chef.cookbooks_path = “cookbooks”» y para cada cookbook nuevo que se quiera incluir, hay que indicarlo en el fichero Vagrantfile.

    Vamos a crear a mano, el cookbook para instalar Django. (Podríamos buscar el cookbooks correspondiente e instalarlo, pero es muy simple hacerlo) Creamos la estructura de ficheros necesaria y editamos el fichero cookbooks/django/recipes/default.rb con el siguiente contenido:

      python_pip 'django' do
          action :install
      end
  • Tenemos todo listo para crear nuestra nueva máquina virtual. Ejecutamos un
    vagrant up

    y tras unos minutos ¡Abra cadabra! Automagicamente, tenemos una maquina virtual lista para programar contra Django. ¡Y sin ver un .iso! :)

  • Comandos útiles:
    vagrant --help
    vagrant up: Levantar la instancia
    vagrant halt: Parar la instancia
    vagrant ssh: Acceder a la instancia y poder trabajar dentro de ella.
    vagrant provision: «Recargar la configuración de la maquina y cookbooks»
    vagrant destroy: Eliminar los ficheros correspondientes a la instancia creada. No borra el fichero de configuración
  • Ya podemos acceder a la máquina y tenemos todo listo para programar. Pero, un momento… ¿Cómo paso el código? Podría configurar un repositorio, pero lo más cómodo, montar una carpeta compartida entre «mi portátil» y la maquina.

    Añadimos al final del fichero VagrantFile la siguiente linea:

    django_config.vm.share_folder "git","/opt/git","/home/anarey/git/djandoapps"

    donde: /opt/git es la ruta de la maquina virtual y «/home/anarey/git/djandoapps» es la ruta origen de los ficheros (en mi portátil)

  • Ya tenemos una máquina nueva, con todo lo necesario para utilizar Django instalado.

Nota: Cuando queramos ejecutar nuestro servidor de Django de pruebas, lo hacemos así:

python manage.py runserver [::]:8000

De esta forma, para ver la pagina que estamos programados, es suficiente con abrir un navegador web y poner la url: http://localhost:8001 (Como indicamos en la redirección de puertos)

URL de referencia: