Script para Snapshot en ESX

Para solventar un problema y poder copiar un snapshot de un ESX a otro ESX tuve que crear éste script.

La idea era la siguiente. Tenemos 2 ESX (ESX y ESX2) y no tenemos cabina de discos, por lo que se me ocurrió pasar el snapshot del ESX al ESX2. Así, en caso de que el ESX caiga, podré levantar el snaphot que tengo en el ESX2.

Necesitaré el propio script y un fichero donde especificar las máquinas virtuales que quiero hacer snapshot y pasar al ESX2. Éste fichero lo llamo vm y estará en la misma ruta del script, es decir, en /opt/script .

No voy a explicar línea por línea lo que hace, ya que entiendo que sabemos algo de scripting 🙂
#!/bin/ash
#
# Copia de ESX2 a ESX del .vmx y .vmdk de la virtual especificada en /opt/scripts/vm
#
# Autor: Javier San Jose
#        IBE/X Servicios Informaticos
#        2011
# Version:  1.2a
#
# Definimos variables
HOST=X.X.X.X
USER=root
PASS=******
BACKUP_DIR=/vmfs/volumes/4c9893fa-8bd92764-00ee-002481a76dec
LOG_DIR=/opt/scripts/logs
DATE=`date +%d%m%y`
FILE=$1
#
[ $# -eq 0 ] && { echo "Usage: $0 filename"; exit 1; }
#
while read line
do
   VM_ID="$( vim-cmd -H $HOST -U $USER -P $PASS vmsvc/getallvms | grep "$line" | awk '{ print $1 }' )"
   VM_NAME="$( vim-cmd -H $HOST -U $USER -P $PASS vmsvc/getallvms | grep "$VM_ID" | sed 1'q;d' | awk '{ print $2 }' )"
   VM_DATASTORE="$( vim-cmd -H $HOST -U $USER -P $PASS vmsvc/get.datastores $VM_ID | grep "url" | awk '{ print $2 }' )"
   VM_VMX="$( vim-cmd -H $HOST -U $USER -P $PASS vmsvc/getallvms | grep "$VM_ID" | sed 1'q;d' | awk '{ print $4 }' )"
   LOG=/var/log/BACKUP_"$VM_NAME"_"$DATE".log
   touch /var/log/BACKUP_"$VM_NAME"_"$DATE".log
#  clear
   echo "------------------------------------------------------------" >> $LOG
   echo "ESXi Backup ["$VM_NAME"] - `date`" >> $LOG
   echo "------------------------------------------------------------" >> $LOG
   echo " " >> $LOG
   echo " " >> $LOG
   echo "Id........: "$VM_ID >> $LOG
   echo "Maquina...: "$VM_NAME >> $LOG
   echo "Datastore.: "$VM_DATASTORE >> $LOG
   echo "VMX.......: "$VM_VMX >> $LOG
   echo " " >> $LOG
   echo "Datastore ORIGEN completo........: "$VM_DATASTORE"/"$VM_NAME >> $LOG
   echo "Datastore DESTINO completo.......: "$BACKUP_DIR"/"$VM_NAME >> $LOG
   echo " " >> $LOG
## Comprobamos si existe la ruta de DESTINO y si no existe, la creamos
   if [ -d $BACKUP_DIR/$VM_NAME ] ; then
      echo "Carpeta "$VM_NAME", existe." >> $LOG
      echo " " >> $LOG
   else
      echo "Carpeta "$VM_NAME", NO existe. La creamos." >> $LOG
      echo " " >> $LOG
      mkdir $BACKUP_DIR/$VM_NAME
   fi
## Independientemente del estado de la maquina, nos copiamos el .VMX
   scp -i /.ssh/key $HOST:$VM_DATASTORE/$VM_NAME/*.vmx $BACKUP_DIR/$VM_NAME/
   echo "Copiado de "$VM_NAME".vmx, correcto en: "$BACKUP_DIR"/"$VM_NAME >> $LOG
   echo " " >> $LOG
## Verificamos si la maquina esta corriendo y si esta corriendo, lanzamos el Snapshot
   echo "Comprobamos si la maquina esta corriendo......" >> $LOG
   echo " " >> $LOG
   VM_STATUS="$( vim-cmd -H $HOST -U $USER -P $PASS vmsvc/get.guest $VM_ID | grep "guestState" | sed 's/^.\{17\}//g' | sed 's/.\{3\}$//' )"
   if [ $VM_STATUS == "running" ]; then
      echo $VM_NAME "esta corriendo. Lanzamos el snapshot..." >> $LOG
      echo " " >> $LOG
      vim-cmd -H $HOST -U $USER -P $PASS vmsvc/snapshot.create $VM_ID "$HOY_$DATE"
   else
      echo $VM_NAME "NO ESTA CORRIENDO..." >> $LOG
      echo " " >> $LOG
   fi
## Se ha creado el snapshot y copiamos el .vmdk
## Copiamos el .VMDK
   scp -i /.ssh/key $HOST:$VM_DATASTORE/$VM_NAME/$VM_NAME-flat.vmdk $BACKUP_DIR/$VM_NAME/
   echo "Copia de SNAPSHOT de "$VM_NAME", correcta en: "$BACKUP_DIR/$VM_NAME >> $LOG
   echo " " >> $LOG
## Una vez copiado el snapshot, la borramos.
   vim-cmd -H $HOST -U $USER -P $PASS vmsvc/snapshot.remove $VM_ID removeChildren
   echo "Snapshot de "$VM_NAME", borrada." >> $LOG
   echo " " >> $LOG
#
done < $FILE

La ejecución la haremos con  ./backup_vm.sh  vm  donde vm es el fichero donde se pondrán los nombres de las máquinas virtuales a las que queremos hacer snapshot y copiarlas. Será una línea por cada servidor.
También se puede hacer mediante un cron, pero eso ya es otra historia….

En éste script se utilizan claves RSA para que no pida las claves de acceso cada vez que se haga la copia. Todo ese proceso lo teneis en Utilizando claves rsa entre ESX

EDIT: Recientemente he tenido que hacer algunos cambios para mejorar el script para un cliente. Subo el nuevo aqui; backup_vm

Por razones de seguridad, he tenido que renombrar la extensión a .doc, pero en cuanto lo bajes, cámbiala a .sh

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s