domingo, 27 de fevereiro de 2011

Perl - Realizando consultas SNMP com o módulo Net::SNMP

O SNMP é um protocolo bastante utilizado em sistemas voltados para gerência e administração permitindo coletar as mais variadas informações de servidores, equipamentos de telecomunicações ou qualquer outro equipamento que o implemente. De maneira geral quando o equipamento implementa pelo menos duas RFCs já é suficiente para coletarmos a maioria das métricas básicas. São elas a RFC1213 ou MIBII e a RFC2790 ou Host Resources MIB. Estas duas RFCs permitem o monitoramento de informações relativas a rede e aos recursos do equipamento como cpu, memória, disco, entre outras.

Com tantas métricas e possibilidades de monitoramento utilizando este protocolo, algumas vezes me deparo (acredito que não só eu) com solicitações para criações de scripts para coleta de informações. Antes eu simplesmente os criava me utilizando da facilidade de jogar o conteúdo de um comando executado para dentro de uma variável. Isso pode ser feito sem problemas, porém você fica dependente de que aquele aplicativo esteja instalado no sistema. 

Pensando em criar algo utilizando uma forma mais elegante, comecei a tentar utilizar o módulo do Perl chamado de Net::SNMP. Este módulo você também precisa instala-lo, mas eu penso que o resultado final de um script fica bem mais profissional. Pois bem, no link acima você poderá dar uma olhada em suas possibilidades.

Quando eu fiz minhas primeiras tentativas de utilizar este módulo não consegui faze-lo da forma correta e nem entender corretamente seu funcionamento. Após comprar os livros que citei no meu artigo anterior, principalmente o primeiro que já esta comigo a algum tempo, consegui ter um entendimento melhor sobre a linguagem e por fim consegui usa-lo. Vi que esta dificuldade não foi somente comigo, inclusive amigos de trabalho acabaram por optar pela velha e tradicional forma de coletar estas informações, jogar o conteúdo de um comando para dentro de uma variável.

Então vamos por a mão na massa. Vamos começar a criar nosso script em Perl para coletar algumas informações:

use strict;
use Data::Dumper;
use Net::SNMP;

Estas linhas irão compor a parte inicial do seu script. Gosto de usar a primeira (use strict;) pois ela te obriga a ter uma forma de programar mais organizada. A segunda (use Data::Dumper;) permite analisarmos a estrutura de um hash e a terceira é o módulo que iremos utilizar para trabalhar aqui. Caso alguma destes módulos não exista você receberá uma mensagem de erro no momento de executar o script. Agora vamos criar uma lista de OIDs que vamos coletar e criar a sessão para coleta SNMP:

my @oids = qw/1.3.6.1.2.1.1.3.0 1.3.6.1.2.1.1.5.0 1.3.6.1.2.1.1.6.0/;
my ($session, $error) = Net::SNMP->session(
-hostname  => 'localhost',
-port      => '161',
-community => 'public',
);

Neste bloco fizemos o seguinte. Definimos os OIDs que vamos coletar (que são respectivamente sysUpTime, sysName e sysLocation) e definimos de quem iremos coletar. Agora vamos executar nossa leitura nos OIDs que definimos na lista no passo anterior e visualizar os resultados:

my $result = $session->get_request( -varbindlist => \@oids,);
$session->close();
print Dumper \%{$result};

Com estes comandos você deverá ver algo como o seguinte:

$VAR1 = {
          '1.3.6.1.2.1.1.6.0' => 'Qualquer Lugar',
          '1.3.6.1.2.1.1.5.0' => 'andre-sti',
          '1.3.6.1.2.1.1.3.0' => '51 minutes, 30.01'
        };

Com isso podemos ver os resultados que coletamos via SNMP nos OIDs que definimos no primeiro passo. Aquele "print Dumper \%{$result}" mostra este resultado pois quando executamos o "$session->get_request" ele retorna um hash, porém a única informação que temos deste hash é sua referencia que fica guardada dentro da variável $result. Se você executar um print na variável $result verá algo assim:

HASH(0x304a4a4)

Esta é a referencia do hash criado pelo Net::SNMP. Para de fato imprimirmos os resultados em um laço foreach por exemplo, temos que fazer o seguinte:

foreach my $oid (@oids) {
chomp($oid);
print "$result->{$oid}\n";
}

Com isso você imprime o resultado da requisição SNMP criada! Acho que este foi o "pulo do gato" que antes não conseguia entender para poder de fato utilizar todo o potencial deste módulo. Este foi um exemplo simples mas espero que com ele quem teve alguma dificuldade em usa-lo agora consiga dar seus passos para criar seus scripts, coletando as métricas SNMP diretamente, sem o uso de aplicativos do sistema operacional. Neste link você pode acessar o script completo que fizemos aqui!

Espero que estas dicas ajudem a quem precisar começar a utilizar este módulo muito útil que o Perl possui. Como sempre, caso existam dúvidas, sugestões, elogios ou críticas podem escrever ou postar aqui mesmo no blog!