[This blog was syndicated from http://nitschinger.at/]

 

Motivación

Dado que trabajo como parte del equipo de ingeniería en Couchbase, necesito ejecutar mi código contra una variedad de despliegues de servidor. Tenemos multitud de sistemas operativos y versiones de software, al igual que nuestros clientes. Con el fin de corregir errores de forma fiable y construir nuevas características, es fundamental conseguir un clúster en funcionamiento que se asemeje a estos despliegues lo mejor posible. Sé que puedo ejecutar todas estas combinaciones en EC2, pero el coste de esto sería muy alto y la mayoría de las veces es una exageración.

Lo que necesito es poner en marcha un clúster de este tipo en cuestión de minutos y no dedicar demasiado tiempo a configurarlo. He oído hablar de Vagrant y Marioneta en el pasado, pero nunca llegué a usarlos en mi propia caja (aunque siempre uso VirtualBox en MacOS para crear máquinas virtuales a mano).

Esta mañana me senté a echar un vistazo más de cerca a cómo estas herramientas pueden ayudarme a ser más productivo - y para mi gran sorpresa conseguí un cluster de 4 nodos de Couchbase Server funcionando en menos de 30 minutos (buscando todos los detalles de configuración). Como es tan fácil, quiero compartirlo contigo.

Requisitos previos

Antes de que podamos aprovisionar nuestros nodos, necesitas asegurarte de tener Vagrant y VirtualBox instalados. Si usas MacOS como yo, simplemente descarga el archivo .dmg para ambos y listo. Ahora, crear un directorio en algún lugar para almacenar los archivos de configuración - Llamé a la mía 'vagabundos'.

En este directorio, debe crear un directorio Vagrantfile. Es como los Vagabundos makefile y lo recogerá para aprender cómo quieres tener tus nodos aprovisionados. Tenga en cuenta que esto no configura el software en la parte superior del sistema operativo (como la instalación de Couchbase), esto es manejado por puppet en un paso separado. Aquí está la configuración completa:

 
Vagrant.configure("2") do |config|

  # Número de nodos a aprovisionar

  númNodos = 4

  # Base de direcciones IP para red privada

  ipAddrPrefix = "192.168.56.10"

  # Definir el número de RAM para cada nodo

  config.vm.provider "virtualbox" do |v|

    v.customize ["modifyvm", :id, "-memory", 1024]

  fin

  # Aprovisionar el propio servidor con puppet

  config.vm.provision :puppet

  # Descarga la caja inicial desde esta url

  config.vm.box_url = "http://files.vagrantup.com/precise64.box"

  # Provision Config para cada uno de los nodos

  1.upto(numNodos) do |num|

    nodeName = ("nodo" + num.to_s).to_sym

    config.vm.define nodeName do |node|

      node.vm.box = "precise64"

      node.vm.network :private_network, ip: ipAddrPrefix + num.to_s

      node.vm.provider "virtualbox" do |v|

      v.name = "Nodo Servidor Couchbase " + num.to_s

    fin

  fin

fin

fin

Este archivo es sólo código ruby que configura Vagrant. Vamos a ir a través de cada directiva y ver lo que hace por nosotros.

# Número de nodos a aprovisionar

númNodos = 4

# Base de direcciones IP para red privada

ipAddrPrefix = "192.168.56.10"

Usted puede cambiar estos valores, acabo de crear para adaptarse a mi entorno aquí. Dependiendo de la cantidad de numNodes se crearán las máquinas virtuales. He añadido un bucle más abajo dependiendo de este ajuste, para no tener que duplicar mucho el código. El prefijo de dirección ip se utiliza para determinar fácilmente la dirección IP (estática) para el servidor. Los números se contarán hacia arriba de forma incremental, por lo que terminará con cuatro servidores accesibles a través de 192.168.56.101 a 192.168.56.104.

# Definir el número de RAM para cada nodo

config.vm.provider "virtualbox" do |v|

  v.customize ["modifyvm", :id, "-memory", 1024]

fin

Este bloque de configuración es necesario para aumentar el tamaño de la memoria de la máquina virtual. Por defecto es menos que eso (creo que alrededor de 512MB), y quiero tener 1 giga de RAM para cada uno. Por supuesto, siéntase libre de ajustar ese valor o eliminarlo por completo.

# Aprovisionar el propio servidor con puppet

config.vm.provision :puppet

Como vamos a utilizar puppet para aprovisionar el software del servidor, necesitamos decirle a Vagrant que lo utilice.

# Descarga la caja inicial desde esta url

config.vm.box_url = "http://files.vagrantup.com/precise64.box"

Vagrant reutiliza imágenes predefinidas para que no tengas que reinstalar todo desde cero. Aquí usamos una caja predefinida de Ubuntu 12.04 64bit.

# Provision Config para cada uno de los nodos

1.upto(numNodos) do |num|

  nodeName = ("nodo" + num.to_s).to_sym

  config.vm.define nodeName do |node|

    node.vm.box = "precise64"

    node.vm.network :private_network, ip: ipAddrPrefix + num.to_s

    node.vm.provider "virtualbox" do |v|

     v.name = "Nodo Servidor Couchbase " + num.to_s

    fin

  fin

fin

Este bloque de código configura cada máquina virtual. Dado el número de nodos que queremos crear, para cada uno de ellos asigna una dirección IP y le da un nombre descriptivo dentro de Virtualbox. Si quieres añadir configuraciones dependientes del servidor, el bloque "nodo" es el lugar adecuado para ello. De lo contrario elegirá la configuración de todo el cluster definida en el bloque "config".

Ahora bien, si ejecutáramos vagabundo arriba desde la línea de comandos en este directorio, tendríamos cuatro máquinas Ubuntu configuradas a las que podríamos acceder mediante SSH, pero no se instalaría nada más. Para hacer que hagan algo, queremos instalar Couchbase Server. Puppet es un software de automatización de sistemas y muy bueno en el aprovisionamiento de sistemas. Vagrant tiene un soporte increíble para ello, todo lo que necesitamos es crear un default.pp dentro de un archivo manifiestos que tiene este aspecto:

exec { "couchbase-server-source":

  comando => "/usr/bin/wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-enterprise_x86_64_2.0.1.deb",

  cwd => "/home/vagrant/",

  crea => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb",

  before => Paquete['couchbase-servidor']

}

exec {"install-deps":

  comando => "/usr/bin/apt-get install libssl0.9.8",

  before => Paquete['couchbase-servidor']

}

paquete {"couchbase-server":

  proveedor => dpkg,

  asegurar => instalado,

  source => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb"

}

Repasemos el interior una vez más.

exec { "couchbase-server-source":

  comando => "/usr/bin/wget http://packages.couchbase.com/releases/2.0.1/couchbase-server-enterprise_x86_64_2.0.1.deb",

  cwd => "/home/vagrant/",

  crea => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb",

  before => Paquete['couchbase-servidor']

}

En puppet, definimos algunas tareas que queremos ejecutar. Esta tarea ejecuta un comando shell wget y almacena el archivo dentro del directorio home del usuario. Le decimos a puppet que descargue el paquete debian del servidor. Tenga en cuenta que hay un antes de a la tarea de instalación del paquete, porque no podemos instalarlo antes de que no se haya descargado el archivo.

exec {"install-deps":

  comando => "/usr/bin/apt-get install libssl0.9.8",

  before => Paquete['couchbase-servidor']

}

También necesitamos instalar libssl0.9.8 en el servidor, esta es la única dependencia que tiene. Utilizamos la herramienta de línea de comandos apt-get por esto.

paquete {"couchbase-server":

  proveedor => dpkg,

  asegurar => instalado,

  source => "/home/vagrant/couchbase-server-enterprise_x86_64_2.0.1.deb"

}

Por último, podemos instalar el paquete debian de couchbase-server, porque el archivo está en su lugar y todas las dependencias están satisfechas.

Por supuesto, este archivo puppet es muy simple y estoy que se puede hacer mucho más con él (y tal vez incluso simplificar aún más) - pero para mis necesidades es más que suficiente. Si quiero una versión diferente del servidor, solo necesito cambiar el archivo puppet y apuntarlo al nuevo paquete debian.

Ahora bien, si ejecutamos vagabundo arriba de nuevo, ocurre mucho más. Tenga en cuenta que si desea jugar con sus archivos de títeres, también puede utilizar provisión para vagabundos para aplicar los cambios mientras el nodo está funcionando.

Si todo va bien, la salida debería tener este aspecto:

Arrancando la máquina 'nodo1' con el proveedor 'virtualbox'...

Arrancando la máquina 'node2' con el proveedor 'virtualbox'...

Poniendo en marcha la máquina 'node3' con el proveedor 'virtualbox'...

Poniendo en marcha la máquina 'node4' con el proveedor 'virtualbox'...

[nodo1] Borrando los puertos reenviados previamente configurados...

[nodo1] Creando metadatos de carpetas compartidas...

[nodo1] Borrando cualquier interfaz de red previamente configurada...

[nodo1] Preparando interfaces de red basadas en la configuración...

[nodo1] Reenviando puertos...

[nodo1] - 22 => 2222 (adaptador 1)

[nodo1] Ejecutando cualquier personalización VM...

[nodo1] Arrancando VM...

[Nodo1] Esperando a que la máquina virtual arranque. Esto puede tardar unos minutos.

[nodo1] ¡VM arrancada y lista para usar!

[nodo1] Configurando y habilitando interfaces de red...

[nodo1] Montando carpetas compartidas...

[nodo1] - /vagrant

[node1] - /tmp/vagrant-puppet/manifests

[nodo1] Ejecutando provisioner: puppet...

Ejecutando Puppet con default.pp...

stdin: no es un tty

aviso: /Stage[main]//Exec[install-deps]/returns: ejecutado con éxito

aviso: Finalizada la ejecución del catálogo en 0,77 segundos

.... más para todos los demás nodos.

A continuación, puede dirigir su navegador a 192.168.56.10[1-4] y trabajar con tu cluster Couchbase. Si ya has terminado, puedes utilizar la función detención de vagabundos para apagarlo limpiamente. También es muy útil vagrant suspenderque guardará el estado de los nodos en lugar de apagarlos por completo.

Si quieres interactuar con uno de los nodos en lugar de con todo el cluster, siempre puedes especificar el identificador del nodo. Por ejemplo, si quieres arrancar sólo el primer nodo puedes hacerlo con la opción vagrant up nodo1 mando.

Para mí, esta es una forma muy rápida y limpia de aprovisionar nodos de servidor. Sólo tengo que cambiar unas pocas líneas en un archivo y obtener un nuevo clúster sin mucha molestia. Aún más importante, puedo poner esos archivos de configuración en el control de versiones y compártelos ¡con otra gente!

Autor

Publicado por Michael Nitschinger

Michael Nitschinger trabaja como Ingeniero de Software Principal en Couchbase. Es el arquitecto y mantenedor del SDK Java de Couchbase, uno de los primeros controladores de bases de datos completamente reactivos en la JVM. También es autor y mantiene el conector Spark de Couchbase. Michael participa activamente en la comunidad de código abierto, contribuyendo a otros proyectos como RxJava y Netty.

3 Comentarios

  1. Sergey Avseyev mayo 28, 2013 a 7:22 am

    Buen trabajo. He hecho algunos cambios a las secuencias de comandos en la repo. Como deshabilitar los tiempos de espera durante el aprovisionamiento en el manifiesto de puppet, más estilo ruby en vagrantfile. Todos ellos integrados ya

  2. J Chris Anderson junio 3, 2013 a 6:38 pm

    Wow esto funcionó tan fácilmente. Menos de 10 minutos de trabajo de mi parte y tengo un cluster de 4 nodos. ¡Gracias!

  3. martijn gijsberti diciembre 4, 2013 a 2:08 pm

    Hola, gracias.

    Funciona a las mil maravillas.

    Consejo para los usuarios principiantes (como yo) Los clusters de couchbase están disponibles en tu navegador bajo 192.168.56.10[1-4]:8091, el número de puerto por defecto tras la instalación.

Dejar una respuesta