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!

sábado, 26 de fevereiro de 2011

Perl vs Shell Script

Desde que comecei a trabalhar com sistemas operacionais, principalmente o Linux, tive a necessidade de começar a usar scripts. Acredito que para uma grande parcela, como foi no meu caso, o início se deu usando Shell Script em bash. Penso que para uma "linguagem", se é que se pode chamar assim, é bastante poderosa permitindo fazer tarefas com certa complexidade.

Recentemente por uma mudança de emprego meu maior foco de contato deixou de ser o Linux e passei a usar bastante a plataforma Microsoft e um pouco Solaris. O primeiro impacto que isso me causou foi o problema de que os scripts criados anteriormente já não poderiam ser utilizados na maioria dos casos. 

Sempre passei perto do perl, mas nunca me enveredei a ponto de aprender a usa-lo. Mas depois de algum tempo e de muitas necessidades por causa do meu novo ambiente de trabalho não teve jeito, precisei começar a usar o perl. Confesso que foi uma experiência bastante positiva. Claro que para sair da inércia não utilizei somente da internet, adquiri um livro e este foi de extrema importância para meu aprendizado inicial. O livro que comprei foi este Learning Perl, quinta edição.

Minhas primeiras linhas de código foram bastante simples mas já consegui vislumbrar que seu potencial é muito grande e consegui fazer coisas de forma mais eficiente, sem contar que existe módulos preparados para comunicações especializadas como leituras SNMP (sem precisar usar o snmpget ou snmpwalk enviando sua saída para uma variável), conexão com banco de dados, sem ter que fazer mirabolancias. O mais legal é pensar em sua portabilidade. Você pode criar um script em um ambiente Linux e com poucas alterações pode te-lo rodando em outro ambiente, como no meu caso em Windows!

Tenho que confessar que minha transição não foi fácil pois já estava "viciado" em Shell Script. Com um pouco de esforço posso dizer que migrei para perl, e digo, foi bastante positivo. Quero começar a postar algumas coisas que venho aprendendo nesta linguagem. Aprendizado este que tem sido fruto de pesquisa na internet, no livro que mencionei acima e na prática constante, errando e acertando. Pensando em me aperfeiçoar um pouco mais fiz a compra de mais um livro, este agora voltado para administração de sistemas e mostrando técnicas de como faze-lo, o livro que comprei foi este Automating System Administration with Perl: Tools to Make You More Efficient. Estes livros foram adquiridos no Amazon pois não os encontrei aqui no Brasil. O legal é que eles entregam aqui no Brasil por um custo de frete bastante acessível.

Bom, esta sendo legal voltar a postar aqui neste blog. Caso alguém tenha alguma idéia sobre o assunto que estou escrevendo aqui sinta-se a vontade para conversarmos e trocarmos experiências. Acho isso muito produtivo e é uma forma de aprendizado!

Um grande abraço a quem passar por aqui!