Clonación de máquinas virtuales en serie

En el lugar donde trabajo, he estado montando y monitoreando muchas máquinas virtuales (gnu/linux sobre gnu/linux). En un principio, las máquinas estaban virtualizadas con VMWare, eran sólo 3 máquinas. Luego estas máquinas fueron aumentando a 5, 10 y actualmente ya son 20 máqiunas. La empresa donde trabajo ofrece el servicio de email marketing en base  a newsletter y “fidelización de clientes“, y soy yo quien debe administrar los servidores de envios de correos. Se envían más de 500 mil emails semanales por lo que el uptime y la disponibilidad del servicio debe ser la más alta.

fide

Para ésto, decidí migrar todas las máquinas a Xen y comenzar a para-virtualizar todos los servidores de envios (nosotros les llamamos “smtp“). Si pensamos que su única función es enviar correos (ya que, de la lógica del servicio se encarga otro servidor), las caracteristicas de cada smtp son muy básicas:

  • 128MB ram
  • 2Gb disco
  • Servicios: postfix, ssh

Para lograr el objetivo, me dediqué a crear un script que me automatiza la creación y configuración de máquinas virtuales.

El script esta hecho en bash y lo único que necesitamos es tener una imágen del sistema (por ej. debian) base, con postfix instalado y la configuración que necesitemos, para luego clonarla en serie. El único trabajo que tenemos que hacer es montar una sola maquina, con todo lo que necesitemos, que sea funcional y luego de hacer pruebas y que todo ande bien, entonces usamos el script para clonarla:

  1. #/bin/bash
  2.  
  3. VM_LIST=machines # file which contains list of ip and hostnames
  4.  
  5. for line in $(grep -v ^# $VM_LIST);
  6. do
  7.         IP_ADDR=$(echo $line |awk -F ‘|’ ‘{print $1}’)
  8.         HOST_NAME=$(echo $line |awk -F ‘|’ ‘{print $2}’)
  9.         MAC=$(echo $line |awk -F ‘|’ ‘{print $3}’)
  10.         NAME=$(echo $HOST_NAME |awk -F . ‘{print $1}’)
  11.         CFG=$NAME.cfg
  12.         IMG=$NAME.img
  13.         FULLPATH_CFG=$DIR\/$HOST_NAME\/$CFG;
  14.         FULLPATH_IMG=$DIR"\/"$HOST_NAME"\/"$IMG;
  15.         FULLPATH_SWAP=$DIR/$HOST_NAME/"swap.img";
  16.         mkdir $HOST_NAME
  17.         echo "Created $HOST_NAME directory."
  18.         echo ">> Copying files …"
  19.         cp draft/swap.img draft/draft.img draft/draft.cfg $HOST_NAME/
  20.         mv $HOST_NAME/draft.img $HOST_NAME/$IMG
  21.         mv $HOST_NAME/draft.cfg $HOST_NAME/$CFG
  22.         echo -n ">> Parsing $CFG …"
  23.         sed -i ‘s/DIR_TO_DISK/\/vm\/mailers\/$HOST_NAME\/$IMG‘/g’ $HOST_NAME/$CFG
  24.         sed -i ‘s/DIR_TO_SWAP/\/vm\/mailers\/$HOST_NAME\/swap.img/g’ $HOST_NAME/$CFG
  25.         sed -i ‘s/HOSTNAME/’$NAME‘/g’ $HOST_NAME/$CFG
  26.         sed -i ‘s/IP_ADDR/’$IP_ADDR‘/g’ $HOST_NAME/$CFG
  27.         sed -i ‘s/MAC/’$MAC‘/g’ $HOST_NAME/$CFG
  28.         echo "  Done."
  29.         mount -oloop -tauto $HOST_NAME/$IMG temp/
  30.         echo ">> Setting up hostname …"
  31.         echo $HOST_NAME > temp/etc/hostname
  32.         echo ">> Setting up postfix (main.cf) …"
  33.         sed -i ‘s/mail[0-9]./’$NAME‘/g’ temp/etc/postfix/main.cf
  34.         echo ">> Setting up ethernet …"
  35.         sed -i ‘s/aaa.bbb.ccc.ddd/’$IP_ADDR‘/’ temp/etc/network/interfaces
  36.         echo ">> Adding RSA Public Key …"
  37.         cat /home/admin/.ssh/id_rsa.pub >> temp/root/.ssh/authorized_keys
  38.         umount temp
  39.         echo "Done."
  40. done

Lo que hace el script, en sencillos pasos es:

– Crear el directorio donde guardaremos nustro fichero de configuración y cosas necesarias.
– Copiar los ficheros necesarios (configuracion de la máquina, imagen del sistema operativo, etc)
– Toma el fichero de configuración y lo parsea para adaptarlo según la configuración que necesitemos.
– Monta la imagen (usando loop)de nuestra nueva máquina.
– Edita y configura los ficheros necesarios dentro de esa máquina virtual.
– Desmontamos y pasamos a la siguiente máquina.

El script se basa en un fichero de “configuración”, el cual nos debe proveer de la dirección IP, la mac y el hostname, en el siguiente formato:

aaa.bbb.ccc.ddd:hostname.tld:ma:c:a:dd:re:ss

Con este post no busco enseñar como migrar o clonar máquinas, simplemente demostrar que se puede automatizar la tarea de clonación de máquinas en serie. Claramente este script no funcionará para los requerimientos de todos nosotros, pero se puede adaptar.

8 comentarios

  1. Cada día te metes más en Xen he?

  2. Zerial

    octubre 27, 2009 a las 11:54 pm

    @Noz: obvio, aprendiendo, enseñando y poniendo en practica cosas nuevas 🙂

  3. muy interesante pero muy fuera de mis conocimientos, estoy luchando por lograr una virtualizacion de una conexion serial entre dos pc con virtual box XD.

    saludos

  4. Zerial

    octubre 28, 2009 a las 8:59 am

    @Andres: o_O Te refieres a hacer una “red” mediante el puerto serial de una maquina virtual a otra? Si es asi … nunca lo he hecho, pero VirtualBox tiene la opcion de asignar puertos seriales (paralelo y de serie creo) a cada maquina, por ende, cada virtualizacion deberia tener en una direccion X el su puerto. En teoria seria lo mismo que hacerlo con dos maquinas “normales” (sin estar virtualizadas)
    saludos

  5. Interesante, aunque aún no logro virtualizar con xen en ubuntu, me quedé pegado con el vmware.

    Sabes que seguridad tiene xen para el caso de una falla de discos?

  6. Buen post, se viene interesante todo este sistema de la virtualización y todas las metodologías aplicables y automatizadas que facilitan estas tareas.

    Un saludo y adelante!

    Daslav Ríos.

  7. saludos kapo!!!
    espero que andes bien zerial…

  8. Boten XEN , instalen proxmox(kvm + openvz)….

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Esto sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.