Ejemplo práctico: Usando el VI Perl Toolkit de VMware

En el post anterior, «Aproximación al VMware Infrastructure Perl Toolkit» vimos la gran cantidad de tareas que podemos realizar usando este kit de herramientas.

A pesar de que podemos parar, arrancar máquinas, asignar discos a VM’s, etc, nunca he sentido la necesidad de crear un script para realizar estas tareas de administración ya que es realmente cómodo y fácil usando el cliente vSphere.

Una necesidad que si se me ha presentado en diversas ocasiones es recordar en qué servidor ESXi estaba una máquina virtual determinada.

Frecuentemente una empresa no puede/quiere permitirse el lujo de pagar una licencia de VMware y tener un vCenter donde centralizar la gestión de todos los servidores de Virtualización. Es por esto que mantienen una serie de ESXi «Free» y cuando el número de estos ESXi empieza a ser elevado resulta complicado recordar en qué servidor habíamos desplegado tal o cual máquina.

Bien es verdad que manteniendo un buen sistema de documentación, con echar una ojeada al documento correspondiente es suficiente, pero ya sabemos por dónde cojean los sysadmins ;) , por lo que decidí hacer un script en Perl que se conectase a todos los ESXi de la organización, obtuviese un listado de las VM’s presentes y además, si estas máquinas están encendidas o apagadas.

Para ello tengo en un fichero aparte (/root/tools/esxs.txt) el nombre dns, usuario y contraseña de todos los ESXi existentes (permisos 400!!):

root@nagios:~/tools# cat esxs.txt
server01.miorganizacion.es,root,password_del_esxi
server02,pepe,pepe
server03.miorganizacion.es,root,password_del_esxi
server04.miorganizacion.es,root,password_del_esxi
server05.miorganizacion.es,root,password_del_esxi
server06miorganizacion.es,root,password_del_esxi
#server07.miorganizacion.es,root,password_del_esxi
server08.miorganizacion.es,root,password_del_esxi
root@nagios:~/tools#

El script abre este archivo, toma las líneas no comentadas, comprueba que existe conectividad al host ESXi para evitar errores, se conecta a él y obtiene las máquinas virtuales existentes en cada uno así como su «Power State» guardando el resultado en otro fichero.

Este es el código:

#!/usr/bin/perl -w
#list_vms
#
# Created Mar 2011 by Ignacio Vazquez Alvarez
#
#
##OBJECTIVE
#---------
#  This script connects to a list of ESX especified in a file, list the vms
#  and write them to another file.
#

use strict;
use warnings;
use VMware::VIRuntime;
use Net::Ping;

my $verbose = 0;
my $data_file="/root/tools/esxs.txt";
my $results_file="/etc/nagios3/vm_inventory.txt";
my $server;
my $user;
my $password;

open(ESXS, $data_file) || die("Could not open file!");
my @raw_data=<ESXS>;
open(RESULTS, "> $results_file") || die("Could not open file results!");

foreach my $linea (@raw_data)
{
    chomp($linea);
    if ($linea !~ /^#(.*)/) ##Commented?
    {
        ($server,$user,$password)=split(/\,/,$linea);
        print "Server \'$server\'\n";
        my $p = Net::Ping->new("icmp");
        if ($p->ping($server))
        {
            $p->close();
            my $session1 = Vim->new(service_url => "https://$server/sdk");
            if ( $session1->login(
                user_name => $user,
                password => $password) )
            {
                print "Correcto\n";
            }
            my $host = $session1->find_entity_view(view_type => 'HostSystem',
                                                filter =>{});

            if (!$host) { die "Host '" . get_option('server'). "' not found\n"; }
            # Obtener la lista de virtual machines
            my $vm_views = $session1->find_entity_views(view_type => 'VirtualMachine');

            foreach my $vm (@$vm_views) {
                # Refresh the state of each view
                $vm->update_view_data();
                print " " . $vm->name . ": " . $vm->runtime->powerState->val . "\n";
                print RESULTS "$server," . $vm->name .  "," . $vm->runtime->powerState->val . "\n";
            }
            $session1->logout();
        }
    }
# esx file end
}

close(ESXS);
close(RESULTS);

El resultado es algo como esto:

server01.miorganizacion.es,Windows_7_home_x86,poweredOff
server01.miorganizacion.es,BT4-R1,poweredOff
server01.miorganizacion.es,Ubuntu 10.10,poweredOn
server01.miorganizacion.es,XP Act 2010,poweredOff
server02.miorganizacion.es,7 ultimate,poweredOff
server02.miorganizacion.es,CentOS 5.5,poweredOn
server02.miorganizacion.es,Debian 6,poweredOn
server02.miorganizacion.es,Win 2003,poweredOn

(...)

Ya tenemos información actualizada de todas nuestras máquinas virtuales pero tener esta información en un fichero txt perdido en un servidor no aporta gran cosa.

Lo que yo hice es crear un nuevo script CGI para Nagios que permita realizar búsquedas en este fichero mostrando los resultados dentro de la WEB de Administración de Nagios.

Prometo explicar cómo lo hice en un próximo post.

Lo prometido es deuda, aquí está ese post.

tags: , , ,
Escrito en Virtualización por Ignacio Vazquez

Follow comments via the RSS Feed | Deja un comentario | Trackback URL

Leave Your Comment

 
desdelaconsola.es