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.