Create oVirt/RHEV’s VM backup

Create backup of oVirt / RHEV’s VMs

[TOC]

Introduction

I’ve been working with oVirt since version 3.5 as main virtualization platform, from day one i were looking for a tool to create VM backups based on snapshot as many solutions does with VMWARE, after some research i didn’t find a tool that fulfilled my requirements so i decided to create one using oVirt python API.

Requirements

  • oVirt >= 4.0
  • Virtual machine with CentOS 7 with this tools installed, we’ll call this VM bkpvm
  • bkpvm should be on the same oVirt Datacenter of the VM we need to take backup of
  • bkpvm should have enought space to store backups
  • Storage Domain should have enought space to take snapshots

How does it work?

This script should run on bkpvm and it connect to oVirt API to do:
– Create snapshot
– Attach disk to bkpvm
– Create a qcow2 file of the VM’s disk
– Delete snapshot

After finish it creates a qcow2 file for each VM’s disk

Instalation

Prerequisites

Install required repositories on bkpvm:

yum install -y epel-release
yum install -y http://resources.ovirt.org/pub/yum-repo/ovirt-release41.rpm

Install required packages from repositories configured:

yum install -y qemu-img python-ovirt-engine-sdk4 python-requests git ovirt-guest-agent wget

Download

cd /opt
git clone https://github.com/vacosta94/VirtBKP.git

We need to get our oVirt’s CA in order to establish secure connections to oVirt API

cd /opt/VirtBKP
wget --insecure "https://ovirt.infratic.com/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA"

Usage

Configure

There is a configuration file default.conf inside VirtBKP folder, that file have all the parameters required by the tool. Should modify this file according your environment as follow:

vim /opt/VirtBKP/default.conf
[bkp]
url             = https://ovirt.example.com/ovirt-engine/api
user            = admin@internal
password        = password
ca_file         = ca.crt
bkpvm           = bkpvm
bckdir          = /mnt/

[restore]
url             = https://ovirt.example.com/ovirt-engine/api
user            = admin@internal
password        = password
ca_file         = ca.crt
storage         = gfs_pool0
proxy           = ovirt.example.com
proxyport       = 54323
  • url: oVirt API URL
  • user: User name
  • password: User password
  • ca_file: Path to ca.crt
  • bkpvm: Name of our bkpvm
  • bckdir: Path to store backups in .qcow2 format
  • storage: Storage domain where we’ll restore our backups
  • proxy: IP or hostname of the ovirt-image-proxy host (Default: ovirt-engine)
  • proxyport: TCP port of the ovirt-image-proxy (Default: 54323)

Create backup

In order to create backups of virtual machines you should use the syntax bellow:

/opt/VirtBKP/backup_vm.py <configuration_file> <vm_name>

Example:

/opt/VirtBKP/backup_vm.py /opt/VirtBKP/default.conf webserver

Restore backup

In order to restore an existing backup you should use the syntax bellow:

/opt/VirtBKP/upload_disk.py <configuration_file> <qcow2_file>

Example

/opt/VirtBKP/upload_disk.py /mnt/webserver_2017-04-28-00h.qcow2

Crear backup de maquinas virtuales oVirt

Crear backup de maquinas virtuales oVirt

Introduccion

Vengo trabajando con oVirt desde la version 3.5 como plataforma de virtualizacion tanto para ambientes de laboratorio, ambientes de produccion y hasta este mismo sitio, desde el inicio busque una forma facil de crear backups de maquinas virtuales basadas en snapshots, luego de investigar encontre de que existia una API pensada para realizar backups de maquinas virtuales, investigando un poco mas encontre scripts que permitian exportar maquinas virtuales de forma a tener un respaldo de las mismas.

Si bien esa solucion me sirvio durante mucho tiempo, rapidamente se volvio muy poco practica a medida que las maquinas virtuales que alojaba crecian, por el simple hecho de que esta solucion necesitaba 3 veces el tamaño de tu maquina virtual debido a que antes de exportar la maquina, la debe clonar.

Una vez que el espacio se volvio un problema decidi, crear mi propio script de backup para maquinas virtuales sobre oVirt.

El proceso es quizas un poco mas complejo que la solucion que acabo de comentar pero necesito menos espacio en disco!. En este documento detallare como funciona y como utilizar la herramienta que cree, espero que le sirva a alguien.

Como funciona

Requisitos:

Los requisitos para utilizar esta solucion son los siguientes:

  • oVirt >= 4.0
  • Una maquina virtual CentOS 7 a la que llamaremos bkpvm
  • Esta maquina virtual debe estar en el mismo Datacenter que las VMs a las que queremos respaldar
  • Esta maquina virtual debe tener espacio suficiente para copiar el disco virtual de las VMs

Que hace exactamente

El script se debe ejecutar en la bkpvm y la misma debe poder acceder a los dominios de almacenamiento donde estan los discos de las maquinas que queremos respaldar.
Los pasos que ejecuta el script son los siguientes:

  • Se conecta a la API de oVirt
  • Crea un snapshot de la maquina que queremos respaldar
  • Adjunta el disco del snapshot a la bkpvm
  • Crea una imagen qcow2 del disco en cuestion
  • Elimina el snapshot
  • Se desconecta de la API de oVirt

Al terminar en forma de respaldo nos queda un archivo qcow2 que no es mas que el disco de la maquina virtual, este archivo lo podemos luego subir al oVirt.

Descargar y utilizar la herramienta

Descargar

Una vez que tenemos nuestra bkpvm instalada debemos instalar un par de paquetes que utiliza el script
Primero debemos habilitar epel y el repositorio de oVirt

yum install -y epel-release
yum install -y http://resources.ovirt.org/pub/yum-repo/ovirt-release41.rpm

Luego instalamos las librerias necesarias de python

yum install -y qemu-img python-ovirt-engine-sdk4 python-requests git

Luego descargamos la ultima version de la herramienta

cd /opt
git clone https://github.com/vacosta94/VirtBKP.git

Obtener CA de nuestro oVirt, deben reemplazar ovirt.example.com por la url de acceso de su oVirt

cd /opt/VirtBKP
curl --insecure "https://ovirt.example.com/ovirt-engine/services/pki-resource?resource=ca-certificate&format=X509-PEM-CA" -o ca.crt;

Configurar

Dentro de la carpeta VirtBKP existe un archivo llamado default.conf, ese archivo es el ejemplo de configuracion que utiliza la herramienta, deben modificar ese archivo con sus datos de acceso, el archivo debe quedar de la siguiente forma:

vim /opt/VirtBKP/default.conf
[bkp]
url            = https://ovirt.example.com/ovirt-engine/api
user        = admin@internal
password    = password
ca_file        = ca.crt
bkpvm        = bkpvm
bckdir         = /mnt/

[restore]
url            = https://ovirt.example.com/ovirt-engine/api
user        = admin@internal
password    = password
ca_file        = ca.crt
storage        = gfs_pool0
proxy        = ovirt.example.com
proxyport    = 54323
  • url Es la URL de nuestro oVirt
  • user El usuario a utilizar para las tareas de backup
  • password Password de dicho usuario
  • ca_file Ruta del ca.crt que descargamos anteriormente
  • bkpvm Nombre de la maquina virtual que creara los backups, este nombre debe ser el nombre que se ve en el portal de administracion de oVirt
  • bckdir Directorio donde se almacenaran los archivos .qcow2
  • storage Dominio de almacenamiento donde se restaurara la imagen .qcow2, este nombre debe ser el nombre que se ve en el portal de administracion de oVirt
  • proxy Equipo que se utilizara como proxy para restaurar la imagen qcow2
  • proxyport Puerto de dicho proxy 54323 es el puerto por defecto del ovirt-image-io-proxy

Crear backup

Para crear backups de maquinas virtuales la sintaxis es la siguiente

python /opt/VirtBKP/backup_vm.py <archivo_conf> <nombre_vm_respaldar>

Por ejemplo para crear un backup de una VM de nombre webserver utilizando la configuracion cargada en el archivo default.conf

python /opt/VirtBKP/backup_vm.py default.conf webserver

Restaurar backup

Para restaurar un backup la sintaxis en la siguiente

python /opt/VirtBKP/upload_disk.py <archivo_conf> <archivo_qcow2>

El archivo qcow2 es el archivo que se creo durante la tarea de respaldo, por ejemplo si el archivo se encuentra en /mnt/webserver_2017-04-28-00h.qcow2

python upload_disk.py /mnt/webserver_2017-04-28-00h.qcow2

Crear usuarios locales en oVirt > 3.5

Crear usuarios locales en oVirt > 3.5

Gracias a la extension ovirt-aaa-jdbc podemos gestionar los usuarios locales del oVirt, dichos usuarios son almacenados en la base de datos del oVirt por lo tanto no requieren de una fuente externa de autenticacion.

Para crear un usuario lo podemos hacer con el comando ovirt-aaa-jdbc-tool, la sintaxis es la siguiente:

ovirt-aaa-jdbc-tool user add nombredelusuario

Por ejemplo para crear un usario stonith

# ovirt-aaa-jdbc-tool user add stonith
adding user stonith...
user added successfully
Note: by default created user cannot log in. see:
/usr/bin/ovirt-aaa-jdbc-tool user password-reset --help.

Con el comando anterior creamos el usuario pero todavia no lo podemos utilizar debido a que falta asignarle un password, la sintaxis para setear un password a un usuario es la siguiente:

/usr/bin/ovirt-aaa-jdbc-tool user  password-reset usuario --password=pass:newpassword --password-valid-to='AAAA-MM-DD HH:MM:ssZ'

Por ejemplo para asignar "12345678" como password para el usuario creado en el ejemplo anterior usaremos el siguiente comando:

# /usr/bin/ovirt-aaa-jdbc-tool user password-reset \
stonith --password=pass:12345678 \
--password-valid-to='2600-12-02 00:00:00Z'
 
updating user stonith...
user updated successfully

Debemos tener en cuenta la opcion --password-valid-to porque si no lo seteamos el toma la fecha actual, es decir al crear nuestro password ya no seria valido.

Una vez que creamos y que asignamos un password al usuario podemos asignarle permisos de la UI de oVirt

Solucionar error Probably resource factory threw an exception.: () oVirt/RHEV vdsm

Solucionar error Probably resource factory threw an exception.: () oVirt/RHEV vdsm

Si al tratar de realizar alguna tarea sobre nuestros discos virtuales, es decir:

  • snapshots
  • clonaciones
  • exportaciones
  • importaciones
  • storage live migration

En la lista de eventos del oVirt GUI se presenta el siguiente error:

Probably resource factory threw an exception.: ()

Y en los logs del vdsm /var/log/vdsm/vdsm.log del host que es SPM encontramos el siguiente mensaje:

OSError: [Errno 17] File exists: '/rhev/data-center/00000002-0002-0002-0002-00000000008b/e1f1947b-b04a-4a50-a22d-f65110516143/images/58693eb1-d498-480e-95e7-524e0a682410'
67acab09-4bfb-4f05-a4f6-a36b31e01743::WARNING::2016-04-03 14:16:45,951::resourceManager::594::Storage.ResourceManager::(registerResource) Resource factory failed to create resource 'e1f1947b-b04a-4a50-a22d-f65110516143_imageNS.58693eb1-d498-480e-95e7-524e0a682410'. Canceling request.
Traceback (most recent call last):
  File "/usr/share/vdsm/storage/resourceManager.py", line 590, in registerResource
    obj = namespaceObj.factory.createResource(name, lockType)
  File "/usr/share/vdsm/storage/resourceFactories.py", line 193, in createResource
    lockType)
  File "/usr/share/vdsm/storage/resourceFactories.py", line 122, in __getResourceCandidatesList
    imgUUID=resourceName)
  File "/usr/share/vdsm/storage/image.py", line 189, in getChain
    srcVol = volclass(self.repoPath, sdUUID, imgUUID, uuidlist[0])
  File "/usr/share/vdsm/storage/blockVolume.py", line 80, in __init__
    volume.Volume.__init__(self, repoPath, sdUUID, imgUUID, volUUID)
  File "/usr/share/vdsm/storage/volume.py", line 181, in __init__
    self.validate()
  File "/usr/share/vdsm/storage/blockVolume.py", line 89, in validate
    volume.Volume.validate(self)
  File "/usr/share/vdsm/storage/volume.py", line 193, in validate
    self.validateImagePath()
  File "/usr/share/vdsm/storage/blockVolume.py", line 460, in validateImagePath
    raise se.ImagePathError(imageDir)
ImagePathError: Image path does not exist or cannot be accessed/created: (u'/rhev/data-center/00000002-0002-0002-0002-00000000008b/e1f1947b-b04a-4a50-a22d-f65110516143/images/58693eb1-d498-480e-95e7-524e0a682410',)

Posiblemente se deba a quedaron links simbolicos rotos en el directorio que apunta a los volumenes presentados al cluster /rhev/data-center/

La solucion para dicho problema es eliminar todos los link simbolicos que se encuentran "rotos", es decir que apuntar a una ruta inexistente, para hacer eso podemos usar el siguiente comando:

[root@virt3 ~]# for file in $(find /rhev/data-center/ -type l); do [ -h "$file" -a ! -e "$file" ] && rm -fvr "$file"; done;

Dicho comando debe ejecutarse en el host que esta como SPM, aunque es recomendable ejecutarlo en todos los hosts de manera a que cuando alguno asuma como SPM no se vuelva a presentar el problema.

Una vez que hecho esto podemos reitentar la tarea que habia fallado.