Nagios – Monitorizando nuestros hosts ESXi

En este documento, veremos todos los pasos necesarios para poder monitorizar un host ESXi, veremos los parámetros más comunes y los valores que podremos obtener para tener un entorno controlado gracias a Nagios y Centreon! Es asombrosa toda la información que podremos obtener! En otros documentos ya veremos otra info que podremos obtener de vCenter y sus MVs, hoy tocan los hosts!

 

 

Instalación de requisitos,

Empezaremos primero instalando todos los requisitos necesarios para usar uno de los scripts más comunes que podemos usar. En Nagios Exchange podremos obtener casi cualquier script que necesitemos, y de ahí nos descargaremos posteriormente uno que suelo usar yo para monitorizar hosts ESXi 4.x, 5.x o 6.x. Pero antes tendremos que instalar en la máquina nagios el SDK de VMware así como todo lo necesario antes.

Tras tener todos los requisitos instalados y probado que funciona el script para monitorizar servidores ESXi, podremos ya salir de consola y usar el interfaz de Centreon para crear los hosts ESXi, los servicios que monitorizaremos y los comandos necesarios. Espero que se entienda bien, a seguir los pasos!

 

Instalando los requisitos:

yum -y install openssl-devel perl-Archive-Zip perl-Class-MethodMaker uuid-perl perl-SOAP-Lite perl-XML-SAX perl-XML-NamespaceSupport perl-XML-LibXML perl-MIME-Lite perl-MIME-Types perl-MailTools perl-TimeDate uuid libuuid perl-Data-Dump perl-UUID make gcc perl-devel libuuid-devel cpan

 

Buscamos en la web de descargas de VMware, el vSphere SDK para Perl, descargamos el paquete gz de 64 bit.

 

Lo subimos al servidor de Nagios mediante WinSCP por ejemplo y lo dejamos en el directorio temporal ‘/tmp/’. Lo descomprimimos y lo instalamos:

tar xvzf VMware-vSphere-Perl-SDK-xxxxxxx.tar.gz
cd vmware-vsphere-cli-distrib/
./vmware-install.pl

 

Lo instalamos con los parámetros predeterminados,

 

Y tras unos segundos lo tendremos instalado,

 

Instalamos UUID:

cd /usr/src
wget http://search.cpan.org/CPAN/authors/id/J/JN/JNH/UUID-0.04.tar.gz
tar -xzvf UUID-0.04.tar.gz -C /opt

 

Lo compilamos:

cd /opt/UUID-0.04
perl Makefile.PL
make

 

Y lo instalamos, así como ‘perl-Nagios-Plugin’ que también será necesario:

make install
yum install perl-Nagios-Plugin

 

Instalamos más requisitos:

cpan GAAS/libwww-perl-5.837.tar.gz

 

Y vamos acabando con este último!

cpan Monitoring::Plugin

 

Por fin, ya podremos bajar el script que nos permitirá obtener información de los hosts aquí https://exchange.nagios.org/directory/Plugins/Operating-Systems/%2A-Virtual-Environments/VMWare/check_vmware_api/details una vez descargado dejaremos el fichero ‘check_vmware_api.pl’ en ‘/usr/lib/centreon/plugins/’ y lo haremos ejecutable con ‘chmod +x check_vmware_api.pl’. Probaremos a ejecutarlo y si todo es correcto nos saldrá esta pantalla indicándonos las opciones que podremos usar.

 

Creando un usuario con privilegios en ESXi,

El script anterior, necesitará validarse contra el host ESXi para obtener la información que nos interese, por tanto crearemos un usuario en cada ESXi y daremos los permisos necesarios.

 

En cada ESXi, tras loguearnos bien con el cliente tradicional o el navegador web, iremos a la zona de “Users” y crearemos uno, le estableceremos también la contraseña.

 

En la pestaña de “Permisos”, añadiremos a este usuario a todo el ámbito posible, y le añadiremos con el rol de ‘Read-Only’.

 

Ahora, crearemos en el directorio que nos interese (yo lo dejo en el mismo de plugins) un fichero, donde almacenaremos el usuario y contraseña que el comando usará para validarse cuando haga los checkeos. En este ejemplo lo guardo en ‘/usr/lib/centreon/plugins/check_vmware_api.auth’ con el siguiente formato:

username=usuario
password=Contraseña

 

Y ya podremos ejecutar cualquier checkeo contra un host ESXi, algo sencillo para probar, uso de CPU:

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l cpu -s usage -w 80 -c 90

 

Los parámetros que acompañan al comando vienen abajo descritos todos, en el comando anterior ‘-w’ será el % de aviso cuando sea Warning y ‘-c’ el valor de cuando sea Critico. Esto os lo comento por que es común en casi todos los comandos, y cada uno que use los varemos que quiera, en estos documentos encontraréis que normalmente cuando alcance el 80% será algo Warning y cuando llegue al 90% será Critical.

 

Ahora ya sólo queda elegir los elementos que más nos interese monitorizar, al final del documento os pondré todas las posibilidades que nos da este excelente comando ‘check_vmware_api.pl’. Pero por ahora os pongo los ejemplos más comunes para monitorizar información de un host ESXi:

 

Uso de Memoria RAM:

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l mem -s usage -w 80 -c 90

 

Uso de Memoria Swap

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l mem -s swap -w 1 -c 10

 

Uso de Memoria Balloning

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l mem -s memctl -w 1 -c 10

 

Uso de red

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l net -s usage -w 10240 -c 102400

 

Detectar si tenemos alguna NIC caida,

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l net -s nic -w 1 -c 2

 

Monitorizar los datastores VMFS, en este, el comando devuelve el uso libre, por lo indicaremos con el siguiente formato en Warning y Critical el % de espacio libre,

 

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l vmfs -s LUN04 -w 10%: -c 5%:

 

Por ejemplo con el parámetro ‘runtime’ veremos un resumen general del servidor, y opcionalmente podremos añadirle otras opciones como ‘health’ para ver la salud, ‘temperature’ para ver los sensores de temperatura, o ‘status’ para ver un resumen entre otros.

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l runtime
./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l runtime -s health
./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l runtime -s temperature
./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l runtime -s status

 

Si usamos el parámetro ‘service’ podremos ver el status de todos los servicios de ESXi si están corriendo o no, y adicionalmente podremos añadirle el nombre de los servicios que nos interese monitorizar unicamente.

./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l service
./check_vmware_api.pl -H SERVIDOR_ESXI -f check_vmware_api.auth -l service -s DCUI vpxa

 

Por ahora con esto creo que nos vale, no? Ya que el script ‘check_vmware_api.pl’ tiene aún muchísimas cosas más que podrás curiosear y ya veremos en otros posts, también nos valdría para monitorizar Clústers de hosts, Data Centers, Máquinas Virtuales, etc… otro día ;), ahora seguimos con los hosts!

 

Creando un host,

Aqui daremos ya por fín de alta en Nagios nuestro primero servidor, un host ESXi! Usaremos Centreon para facilitar todo el trabajo.

 

 

Desde “Configuration” > “Hosts” > “Add”, añadiremos nuestro primer servidor, completaremos al menos los siguientes campos:

  • Name: Nombre del servidor.
  • Alias: Alias del servidor.
  • IP Address / DNS: La dirección IP o nombre DNS del servidor.
  • SNMP Community & Version: En este caso no sería necesario.
  • Monitored from: El poller que monitorizará este host.
  • Template: Seleccionamos ‘generic-active-host’.

 

Creando un Comando,

Definiremos un Comando en Centreon usando variables para poder ejecutar los comandos que vimos antes, este comando luego será llamado desde cada Servicio que creemos para monitorizar la CPU, RAM… Qué mejor que verlo para entenderlo 🙂

 

Me suele gustar llamar al Comando igual que el script, por eso, en este caso crearé el comando ‘check_vmware_api.pl’. Para ello, desde “Configuration” > “Commands” > “Checks” > “Add”.  Indicamos que es un comando de tipo ‘Check’ y en el ‘Command line indicamos’:

$CENTREONPLUGINS$/check_vmware_api.pl -H $HOSTADDRESS$ -f $CENTREONPLUGINS$/check_vmware_api.auth -l $ARG1$ -s $ARG2$ -w $ARG3$ -c $ARG4$
  • La variable $CENTREONPLUGINS$ es ‘/usr/lib/centreon/plugins/’
  • La variable $HOSTADDRESS$ sería la dirección IP o nombre FQDN del servidor a monitorizar.
  • ARG1 sería el primer argumento que le pasaremos, si recordamos es el ‘Comando’ que se indica tras ‘-l’.
  • ARG2 sería el primer argumento que le pasaremos,si recordamos es el ‘SubComando’ que se indica tras ‘-s’.
  • ARG3 será el valor de Warning.
  • ARG4 será el valor de Critical.

Pulsamos en “Describe arguments” para no tener que memorizar y saber esto.

 

Así que asociamos de una forma sencilla qué es cada Argumento, que luego cuando creemos los servicios, lo agradeceremos. “Save”.

 

Creando los servicios,

Aquí ya por fín podremos crear los servicios de lo que queremos monitorizar, sea CPU, RAM, NICs caidas, estado de los datastores… para ello, nos apoyaremos como hemos dicho en el comando que acabamos de crear! Mirar qué fácil:

 

En “Configuration” > “Services” > “Add”, crearemos nuestro primer servicio! Rellenaremos al menos los siguientes datos:

  • Description: Nombre del servicio, en mi caso CPU, Memoria RAM, Memoria Swap…
  • Linked with Hosts: Aquí añadiremos el host que hemos creado antes, nuestro servidor ESXi.
  • Template: Seleccionamos ‘generic-active-service’.
  • Check Command: Escogemos el comando que hemos creado antes también, que en mi caso le llame como el script ‘check_vmware_api.pl’
  • Argumentos: Deberemos rellenar todos los argumentos que nos pida el comando.
    • Uso de CPU: cpu / usage / 80 / 90
    • Memoria RAM: mem / usage / 80 / 90
    • Memoria Swap: mem / swap / 1 / 10
    • Memoria Balloning: mem / memctl / 1/ 10
    • Estado de NIC: net / nic / 1 / 2

Grabamos con “Save”,

 

Para ir creando el resto de servicios, en vez de crearlos todos desde cero, lo más cómodo será duplicarlos, así sólo tendremos que editar los argumentos y será mucho más fácil crear los servicios.

 

 

Una vez que hayamos creado todos los servicios asociados a un host ESXi, si queremos ahora duplicar el trabajo realizado para monitorizar otro host ESXi que tengamos, o todos los que tengamos, pues desde “Configuration” > “Hosts”, seleccionaremos el ESXi que tenemos y lo duplicamos, con eso generamos un nuevo host, al que tendremos que cambiar el Nombre, Alias y Direccion IP y ya tendremos otro host listo con los mismos servicios!

 

Y nada, lo de siempre, una vez finalizado el trabajo, guardamos los cambios, Cenreon generará los ficheros de nagios necesarios, “Configuration” > “Pollers” > “Export configuration”,

 

Seleccionamos nuestro poller, marcamos los checks y reiniciamos & “Export”,

 

Una vez generado todo, ya podremos ir a la parte de monitorización y comprobar que todo lo que hemos hecho funciona! Veremos todos los nuevos servicios que hemos creado que monitorizan distintas cosas. Si queremos forzar el checkeo, ya sabemos, seleccionamos los servicios que nos interesen y en el combo seleccionamos ‘Services – Schedule immediate check (Forced)’.

 

Y aquí os dejo todas las posibilidades del comando:

Usage: check_vmware_api.pl -D <data_center> | -H <host_name> [ -C <cluster_name> ] [ -N <vm_name> ]
    -u <user> -p <pass> | -f <authfile>
    -l <command> [ -s <subcommand> ] [ -T <timeshift> ] [ -i <interval> ]
    [ -x <black_list> ] [ -o <additional_options> ]
    [ -t <timeout> ] [ -w <warn_range> ] [ -c <crit_range> ]
    [ -V ] [ -h ]
 -?, --usage
   Print usage information
 -h, --help
   Print detailed help screen
 -V, --version
   Print version information
 --extra-opts=[@file]
Read options from an ini file.
   for usage and examples.
 -H, --host=<hostname>
   ESX or ESXi hostname.
 -C, --cluster=<clustername>
   ESX or ESXi clustername.
 -D, --datacenter=<DCname>
   Datacenter hostname.
 -N, --name=<vmname>
   Virtual machine name.
 -u, --username=<username>
   Username to connect with.
 -p, --password=<password>
   Password to use with the username.
 -f, --authfile=<path>
   Authentication file with login and password. File syntax :
   username=<login>
   password=<password>
 -w, --warning=THRESHOLD
   Warning threshold. See
   for the threshold format. By default, no threshold is set.
 -c, --critical=THRESHOLD
   Critical threshold. See
   for the threshold format. By default, no threshold is set.
 -l, --command=COMMAND
   Specify command type (CPU, MEM, NET, IO, VMFS, RUNTIME, ...)
 -s, --subcommand=SUBCOMMAND
   Specify subcommand
 -S, --sessionfile=SESSIONFILE
   Specify a filename to store sessions for faster authentication
 -x, --exclude=<black_list>
   Specify black list
 -o, --options=<additional_options>
   Specify additional command options (quickstats, ...)
 -T, --timestamp=<timeshift>
   Timeshift in seconds that could fix issues with "Unknown error". Use values like 5, 10, 20, etc
 -i, --interval=<sampling period>
   Sampling Period in seconds. Basic historic intervals: 300, 1800, 7200 or 86400. See config for any changes.
   Supports literval values to autonegotiate interval value: r - realtime interval, h<number> - historical interval specified by position.
   Default value is 20 (realtime). Since cluster does not have realtime stats interval other than 20(default realtime) is mandatory.
 -M, --maxsamples=<max sample count>
   Maximum number of samples to retrieve. Max sample number is ignored for historic intervals.
   Default value is 1 (latest available sample).
 --trace=<level>
   Set verbosity level of vSphere API request/respond trace
 --generate_test=<file>
   Generate a test case script from the executed command/subcommand and write it to <file>.   If <file> is "stdout", the test case script is written to stdout instead.
 -t, --timeout=INTEGER
   Seconds before plugin times out (default: 30)
 -v, --verbose
   Show details for command-line debugging (can repeat up to 3 times)
Supported commands(^ - blank or not specified parameter, o - options, T - timeshift value, b - blacklist) :
    VM specific :
        * cpu - shows cpu info
            + usage - CPU usage in percentage
            + usagemhz - CPU usage in MHz
            + wait - CPU wait time in ms
            + ready - CPU ready time in ms
            ^ all cpu info(no thresholds)
        * mem - shows mem info
            + usage - mem usage in percentage
            + usagemb - mem usage in MB
            + swap - swap mem usage in MB
            + swapin - swapin mem usage in MB
            + swapout - swapout mem usage in MB
            + overhead - additional mem used by VM Server in MB
            + overall - overall mem used by VM Server in MB
            + active - active mem usage in MB
            + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning
            ^ all mem info(except overall and no thresholds)
        * net - shows net info
            + usage - overall network usage in KBps(Kilobytes per Second)
            + receive - receive in KBps(Kilobytes per Second)
            + send - send in KBps(Kilobytes per Second)
            ^ all net info(except usage and no thresholds)
        * io - shows disk I/O info
            + usage - overall disk usage in MB/s
            + read - read disk usage in MB/s
            + write - write disk usage in MB/s
            ^ all disk io info(no thresholds)
        * runtime - shows runtime info
            + con - connection state
            + cpu - allocated CPU in MHz
            + mem - allocated mem in MB
            + state - virtual machine state (UP, DOWN, SUSPENDED)
            + status - overall object status (gray/green/red/yellow)
            + consoleconnections - console connections to VM
            + guest - guest OS status, needs VMware Tools
            + tools - VMware Tools status
            + issues - all issues for the host
            ^ all runtime info(except con and no thresholds)
    Host specific :
        * cpu - shows cpu info
            + usage - CPU usage in percentage
                o quickstats - switch for query either PerfCounter values or Runtime info
            + usagemhz - CPU usage in MHz
                o quickstats - switch for query either PerfCounter values or Runtime info
            ^ all cpu info
                o quickstats - switch for query either PerfCounter values or Runtime info
        * mem - shows mem info
            + usage - mem usage in percentage
                o quickstats - switch for query either PerfCounter values or Runtime info
            + usagemb - mem usage in MB
                o quickstats - switch for query either PerfCounter values or Runtime info
            + swap - swap mem usage in MB
                o listvm - turn on/off output list of swapping VM's
            + overhead - additional mem used by VM Server in MB
            + overall - overall mem used by VM Server in MB
            + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning
                o listvm - turn on/off output list of ballooning VM's
            ^ all mem info(except overall and no thresholds)
        * net - shows net info
            + usage - overall network usage in KBps(Kilobytes per Second)
            + receive - receive in KBps(Kilobytes per Second)
            + send - send in KBps(Kilobytes per Second)
            + nic - makes sure all active NICs are plugged in
            ^ all net info(except usage and no thresholds)
        * io - shows disk io info
            + aborted - aborted commands count
            + resets - bus resets count
            + read - read latency in ms (totalReadLatency.average)
            + write - write latency in ms (totalWriteLatency.average)
            + kernel - kernel latency in ms
            + device - device latency in ms
            + queue - queue latency in ms
            ^ all disk io info
        * vmfs - shows Datastore info
            + (name) - free space info for datastore with name (name)
                o used - output used space instead of free
                o brief - list only alerting volumes
                o regexp - whether to treat name as regexp
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh
            ^ all datastore info
                o used - output used space instead of free
                o brief - list only alerting volumes
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh
        * runtime - shows runtime info
            + con - connection state
            + health - checks cpu/storage/memory/sensor status and propagates worst state
                o listitems - list all available sensors(use for listing purpose only)
                o blackregexpflag - whether to treat blacklist as regexp
                b - blacklist status objects
            + storagehealth - storage status check
                o blackregexpflag - whether to treat blacklist as regexp
                b - blacklist status objects
            + temperature - temperature sensors
                o blackregexpflag - whether to treat blacklist as regexp
                b - blacklist status objects
            + sensor - threshold specified sensor
            + maintenance - shows whether host is in maintenance mode
                o maintwarn - sets warning state when host is in maintenance mode
                o maintcrit - sets critical state when host is in maintenance mode
            + list(vm) - list of VMware machines and their statuses
            + status - overall object status (gray/green/red/yellow)
            + issues - all issues for the host
                b - blacklist issues
            ^ all runtime info(health, storagehealth, temperature and sensor are represented as one value and no thresholds)
        * service - shows Host service info
            + (names) - check the state of one or several services specified by (names), syntax for (names):<service1>,<service2>,...,<serviceN>
            ^ show all services
        * storage - shows Host storage info
            + adapter - list bus adapters
                b - blacklist adapters
            + lun - list SCSI logical units
                b - blacklist LUN's
            + path - list logical unit paths
                b - blacklist paths
            ^ show all storage info
        * uptime - shows Host uptime
                o quickstats - switch for query either PerfCounter values or Runtime info
        * device - shows Host specific device info
            + cd/dvd - list vm's with attached cd/dvd drives
                o listall - list all available devices(use for listing purpose only)
    DC specific :
        * cpu - shows cpu info
            + usage - CPU usage in percentage
                o quickstats - switch for query either PerfCounter values or Runtime info
            + usagemhz - CPU usage in MHz
                o quickstats - switch for query either PerfCounter values or Runtime info
            ^ all cpu info
                o quickstats - switch for query either PerfCounter values or Runtime info
        * mem - shows mem info
            + usage - mem usage in percentage
                o quickstats - switch for query either PerfCounter values or Runtime info
            + usagemb - mem usage in MB
                o quickstats - switch for query either PerfCounter values or Runtime info
            + swap - swap mem usage in MB
            + overhead - additional mem used by VM Server in MB
            + overall - overall mem used by VM Server in MB
            + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning
            ^ all mem info(except overall and no thresholds)
        * net - shows net info
            + usage - overall network usage in KBps(Kilobytes per Second)
            + receive - receive in KBps(Kilobytes per Second)
            + send - send in KBps(Kilobytes per Second)
            ^ all net info(except usage and no thresholds)
        * io - shows disk io info
            + aborted - aborted commands count
            + resets - bus resets count
            + read - read latency in ms (totalReadLatency.average)
            + write - write latency in ms (totalWriteLatency.average)
            + kernel - kernel latency in ms
            + device - device latency in ms
            + queue - queue latency in ms
            ^ all disk io info
        * vmfs - shows Datastore info
            + (name) - free space info for datastore with name (name)
                o used - output used space instead of free
                o brief - list only alerting volumes
                o regexp - whether to treat name as regexp
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh
            ^ all datastore info
                o used - output used space instead of free
                o brief - list only alerting volumes
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh
        * runtime - shows runtime info
            + list(vm) - list of VMware machines and their statuses
            + listhost - list of VMware esx host servers and their statuses
            + listcluster - list of VMware clusters and their statuses
            + tools - VMware Tools status
                b - blacklist VM's
            + status - overall object status (gray/green/red/yellow)
            + issues - all issues for the host
                b - blacklist issues
            ^ all runtime info(except cluster and tools and no thresholds)
        * recommendations - shows recommendations for cluster
            + (name) - recommendations for cluster with name (name)
            ^ all clusters recommendations
    Cluster specific :
        * cpu - shows cpu info
            + usage - CPU usage in percentage
            + usagemhz - CPU usage in MHz
            ^ all cpu info
        * mem - shows mem info
            + usage - mem usage in percentage
            + usagemb - mem usage in MB
            + swap - swap mem usage in MB
                o listvm - turn on/off output list of swapping VM's
            + memctl - mem used by VM memory control driver(vmmemctl) that controls ballooning
                o listvm - turn on/off output list of ballooning VM's
            ^ all mem info(plus overhead and no thresholds)
        * cluster - shows cluster services info
            + effectivecpu - total available cpu resources of all hosts within cluster
            + effectivemem - total amount of machine memory of all hosts in the cluster
            + failover - VMware HA number of failures that can be tolerated
            + cpufairness - fairness of distributed cpu resource allocation
            + memfairness - fairness of distributed mem resource allocation
            ^ only effectivecpu and effectivemem values for cluster services
        * runtime - shows runtime info
            + list(vm) - list of VMware machines in cluster and their statuses
            + listhost - list of VMware esx host servers in cluster and their statuses
            + status - overall cluster status (gray/green/red/yellow)
            + issues - all issues for the cluster
                b - blacklist issues
            ^ all cluster runtime info
        * vmfs - shows Datastore info
            + (name) - free space info for datastore with name (name)
                o used - output used space instead of free
                o brief - list only alerting volumes
                o regexp - whether to treat name as regexp
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh
            ^ all datastore info
                o used - output used space instead of free
                o brief - list only alerting volumes
                o blacklistregexp - whether to treat blacklist as regexp
                b - blacklist VMFS's
                T (value) - timeshift to detemine if we need to refresh

Héctor Herrero

Autor del blog Bujarra.com
Cualquier necesidad que tengas, no dudes en contactar conmigo, os intentare ayudar siempre que pueda, compartir es vivir 😉 . Disfrutar de los documentos!!!

Últimos Posts de: Héctor Herrero (ver todos)