Hilarious (?)

Guardando información de soporte de hardware en Spacewalk o Red Hat Satellite

¿Como hacer para guardar, de manera centralizada, toda la información de soporte de servidores, laptops o PCs Dell, para poder consultar la información rápidamente, generar reportes, etc?

Al respecto escribí este artículo para el Blog Services Speak, de Red Hat, que ahora traduzco al español y publico acá.

Si tienen algún tipo de hardware Dell registrado en Spacewalk o Satellite, como PCs, notebooks, o servidores, sepan que hay una manera muy sencilla de almacenar la información de soporte de estos equipos, de manera centralizada, en Spacewalk o Satellite. Dell provee un servicio web que puede usarse libremente para consultar información de soporte, simplemente utilizando el service tag de un equipo. Esta valiosa información incluye fecha de envío, region, modelo, además de la fecha de inicio y fin de cada contrato de soporte activo o expirado. Click aquí para leer más sobre este servicio web.

Tu servidor Spacewalk o Satellite ya está almacenando la información del hardware de cada uno de tus activos, por lo que lo único que resta hacer es extraer esa información, consultar en el webservice de Dell, y luego guardar la salida. Esto es muy sencillo de hacer utilizando las APIs de Spacewalk o Satellite, y el modulo de Perl SOAP Lite. Así es como empieza este script:

#!/usr/bin/perl –w
use strict;
use warnings;
use Frontier::Client;
use SOAP::Lite;

Lo segundo que vamos a hacer es logearnos al servidor Spacewalk o Satellite usando la API “auth.login”, y obtener un identificador de session válido. Tu servidor tiene documentación y scripts que muestran como hacer esto (Ver en Documentation > API > Sample Scripts), y básicamente se resume a esto:

my $client = new Frontier::Client(url => "http://satellite.example.com/rpc/api");
my $session = $client->call('auth.login', '', '');

A continuación, obtenemos un listado completo de clientes registrados, y filtramos aquellos que tienen “Dell” en el campo “vendor”:

my $systems = $client->call('system.listUserSystems', $session);
foreach (@$systems) {
  my $systemId = $_->{'id'};
  my $hwInfo = $client->call('system.getDmi', $session, $systemId);
  next unless ($hwInfo->{'vendor'} =~ /Dell/);

Ahora que sabemos que todos los equipos que estamos manejando son “Dell”, extraemos y validamos los service tag de cada uno:

my ($ServiceTag) = $hwInfo->{'asset'} =~ /system: (\w+)\)/;
next if ( !defined($ServiceTag) or $ServiceTag !~ m/^\w{7}$/ );

Y aquí es cuando las cosas se ponen más interesantes. Con el service tag, creamos un “SOAP envelope” que enviaremos al webservice de Dell:

my $envelope = SOAP::Lite
-> uri('http://support.dell.com/WebServices/')
-> on_action( sub { join '', @_ } )
-> proxy('http://xserv.dell.com/services/assetservice.asmx');
my $method = SOAP::Data->name('GetAssetInformation')
->attr({xmlns => 'http://support.dell.com/WebServices/'});
my @params = (
SOAP::Data->name(guid => '11111111-1111-1111-1111-111111111111'),
SOAP::Data->name(applicationName => 'dellAssetInformation'),
SOAP::Data->name(serviceTags => $ServiceTag) );
my $results = $envelope->call($method => @params)->result;

Para conocer más sobre este último bloque de código, ver este artículo.

Ya hemos creado el envelope con el service tag y lo hemos enviado a Dell. Ahora, queremos extraer la información del resultado, que está agrupada en dos tipos de datos: AssetHeaderData y EntitlementsData. El primero contiene información estática que no debería cambiar a medida que pasa el tiempo, como es el modelo de hardware, fecha de envío, región, o el mismo service tag. El segundo, por el contrario, contiene información relacionada con los contratos de soporte a medida que fueron renovados, tal como cuando empezó o terminó el contrato, si está activo o expirado, etc. Más información sobre esto aquí.

Entonces, guardamos la información del equipo y los contratos:

my $assetInfo = $results->{Asset}{AssetHeaderData};
my $assetSupp = $results->{Asset}{Entitlements}{EntitlementData};

Una cosa que aprendí usando esta herramienta es que en algunos países, los equipos enviados no siempre tienen seteadas las variables SystemType y SystemModel, así que para evitar errores, mejor unificar esta información en una sola línea:

my $model = "";
$model .= $assetInfo->{SystemType}." " if defined $assetInfo->{SystemType};
$model .= $assetInfo->{SystemModel} if defined $assetInfo->{SystemModel};

Para que la información se vea bien en Spacewalk o Satellite, defino un formato tal que las columnas queden alineadas en una tabla, y comienzo a completarla con los datos que me devolvió Dell:

my $fmt = "%-15s%-15s%-11s%-20s\n";
my $table = sprintf ($fmt, "Service Tag:", $assetInfo->{ServiceTag}, "Model: ", $model);
$table .= sprintf ($fmt, "Shipping Date:", (split ("T", $assetInfo->{SystemShipDate}))[0], "Region:", $assetInfo->{Region}."\n");

Hasta ahora todo bien, pero antes de guardar esta tabla como una nota en el server en cuestión, necesito revisar si la nota ya existía, y en tal caso borrarla. Luego guardo la nota nueva:

my $subject = "Dell Support Information";
my $notes = $client->call('system.listNotes', $session, $systemId);
foreach my $note (@$notes) {
   next unless ( $note->{'subject'} eq $subject );
   $client->call('system.deleteNote', $session, $systemId, $note->{'id'});
}
$client->call('system.addNote', $session, $_->{'id'}, $subject, $table);

Para finalizar, cierro el loop que corría por la lista de equipos, y utilizo la API “auth.logout” para expirar la sesión que estaba usando. Eso es todo.

Luego de correr el script, me dirijo a mi servidor Spacewalk o Satellite, entro en uno de los equipos, y en la parte de notas encuentro una que se ve así:

picture-1-blog-post

Hay muchas cosas que se pueden hacer con esta información, como generar reportes de equipos sin contrato activo de soporte. Otra manera de usarla es, teniendo equipos que no pueden conectarse a internet, crear un script que extraiga esta nota de Spacewalk o Satellite, y mostrarla por línea de comandos, así:

picture-2-blog-post

Como pueden ver, las APIs son una de las características más poderosas de Spacewalk y Satellite. Cuando las usan en profundidad, les permitirán llevar la automatización de tareas al máximo, ahorrándoles mucho tiempo. Si además lo combinan con la capacidad de almacenar casi cualquier tipo de información, podrán lograr que Spacewalk o Satellite sean la fuente de información de sus equipos.

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *