quinta-feira, 3 de outubro de 2013

Monitoramento de VMs com Zabbix 2.2

Introdução:
Uma das grandes novidades da versão 2.2 é a possibilidade de monitoramento de máquinas virtuais de forma automatizada pelo recurso LLD (Low Level Discovery).

Advertencia:
Para esse tutorial estou usando a versão alpha do Zabbix, mais especificamente a 2.1.6 (sétimo alpha).

Apesar de funcional para demonstração do recurso essa versão não deve ser utilizada em produção.

Preparação do Ambiente:
Utilizei o Sistema Operacional CentOS 6.4 na opção de instalação minimal.

Após isso instalei os repositórios epel e remi:
# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

É preciso habilitar o remi depois de instalado:
# vi /etc/yum.repos.d/remi.repo
Altere a linha enabled=1

Atualizar o sistema:
# yum update -y

Desativar SeLinux e Firewall 

Instalação do Zabbix:
 Para realizar a instalação do Zabbix podemos seguir esse tutorial, modificando alguns detalhes.

Suprir as Dependências:
Na seção suprir as dependências, vamos acrescentar alguns pacotes, pelo fato de estar usando o CentOS Minimal, e o novo pré-requisito utilizado no monitoramento de VMs a libxml2.
# yum -y install ntsysv make wget bind-utils httpd php php-common php-mysql php-gd php-bcmath php-mbstring php-xml mysql mysql-server mysql-devel net-snmp net-snmp-devel net-snmp-utils net-snmp-libs gcc curl curl-devel libxml2-devel libxml2

Atenção na hora de realizar o download dos fontes para escolher a versão correta (Alpha Releases).

Configurar e Compilar os Códigos Fontes (Sources):
Na seção configurar e compilar os códigos fontes, precisamos adicionar o novo pré-requisito utilizado no monitoramento de VMs a libxml2.
./configure --enable-server --with-mysql --with-net-snmp --with-libcurl --enable-agent --with-libxml2

Observe na saída final a linha de Flags de Compilação:
Compiler flags:        -g -O2  -I/usr/include/mysql -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -fasynchronous-unwind-tables -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -fno-strict-aliasing -fwrapv -fPIC  -fPIC -g -static-libgcc -fno-omit-frame-pointer -fno-strict-aliasing -DMY_PTHREAD_FASTMUTEX=1        -I/usr/include/rpm -I/usr/local/include -I/usr/lib/perl5/CORE -I. -I/usr/include   -I/usr/include/libxml2

Todo o resto do processo permanece inalterado.

Conhecendo os Templates Disponíveis:

Templates Disponíveis
Configurando o Host:
Faça a configuração normal do host, acrescente o template e as seguintes macros:
{$URL}: https://<IP-address>/sdk (URL do vCenter / ESX / ESXi)
{$USERNAME}: Usuário
{$PASSWORD}: Senha

Se estiver na dúvida sobre esses dados, acesse https://<IP-address> e clique em Browse datastores in this host's inventory, teste seu usuário e senha, se der certo é esse usuário e senha que você vai usar ;-)
Testando credencias
Exemplos de Dados Coletados:

Dados do servidor ESXi
VMs Descobertas Automaticamente
VM Windows
VM Linux

VMs descobertas automáticamente
 Considerações Finais:
Usei uma máquina ESXi 5.1 com o template Template Virt VMware vSphere.
Você pode ir no template em Discovery e baixar o intervalo default de 3600 segundos (1 hora) para 300 segundos (5 minutos), para agilizar os testes.

Fonte e Agradecimentos:
Agradeço ao 九龍真乙 @qryuu por ter disponibilizado essa apresentação, eu vinha realizando vários testes sem sucesso, pois não sabia o que colocar na variável {$URL}, mas graças a ele esse tutorial foi possível.

sexta-feira, 17 de maio de 2013

Criando um Planet

Introdução:
Um planet é um concentrador de artigos relacionados a determinado assunto, no mundo do Software Livre, existem muitos Planets famosos: Planet Apache, Planet Debian, Planet Gnome, Planet KDE e etc.

Como funciona?

Basicamente você configura seu planet para ler os feed rss de determinados sites/blogs, na maioria das vezes essa configuração é feita para pegar apenas o rss de determinadas categorias/tags. Com isso os usuários fazem os posts em seus sites/blogs e automaticamente isso é publicado no planet, a vantagem para os que acessam o planet é que todas as informações estão concentradas em um único lugar.

Configuração nos sites/blogs que irão alimentar o Planet:
A única coisa que o site/blog precisa fazer é habilitar o rss das notícias, porém duas ações são fortemente recomendadas:
  • Utilizar categorias/tags nas postagens;
  • Alterar o feed do rss para mostrar apenas o resumo (sinopse).
Suprindo as dependências de instalação:
A única dependência é a instalação do Python 2.2 (ou superior) no sistema.

Instalação do Planet:
Baixe a última versão estável do pacote no site Planet Planet. Por exemplo, para a versão no momento em que escrevo esse post, usei os comandos:
# cd /var/www/html
# wget http://www.planetplanet.org/download/planet-2.0.zip


Descompacte o pacote e renomeie o diretório:
# unzip planet-2.0.zip
# mv planet-2.0 planetzabbixbrasil


Torne o script executável, acesse o diretório de exemplos, e copie o diretório fancy para o nome que você quer dar ao planet, vou usar como exemplo o zabbix:
# cd planetzabbixbrasil
# chmod 755 planet.py
# cd examples
# cp -rv fancy zabbix


Configurando o planet:
As configurações são bem simples e com exemplos, vou comentar apenas alguns trechos, uma versão traduzida do arquivo pode ser encontrada no Viva o Linux
# cd zabbix/
# vi config.ini
[Planet]
name = Planet Zabbix Brasil
link = http://planet.zabbixbrasil.org
owner_name = Zabbix Brasil
owner_email = zabbixbr@zabbixbrasil.org

cache_directory = examples/cache
new_feed_items = 2
log_level = DEBUG
feed_timeout = 20

template_files = examples/fancy/index.html.tmpl examples/atom.xml.tmpl examples/rss20.xml.tmpl examples/rss10.xml.tmpl examples/opml.xml.tmpl examples/foafroll.xml.tmpl

output_dir = examples/output
items_per_page = 60
date_format = %d de %B de %Y, %H:%M
new_date_format = %d de %B de %Y
encoding = utf-8
locale = pt_BR.UTF-8

days_per_page = 7

activity_threshold = 0

[DEFAULT]
facewidth = 65
faceheight = 85

#Entrada dos blogs:
[http://andredeo.blogspot.com.br/feeds/posts/default/-/Zabbix?alt=rss]
name = André Déo
face = deo.png

O parâmetro face serve para mostrar uma miniatura do logo do blog/site ou rosto do autor, ele é opcional e a imagem deve estar dentro da pasta examples/output/images.

Colocando o endereço dos rss:

Wordpress:
[http://nome-do-blog.wordpress.com/categoria/nome-da-categoria/feed/]
[http://spinola.net.br/blog/?cat=3/zabbix/feed/]
[http://gutocarvalho.net/octopress/categories/zabbix/atom.xml]
[http://www.helviojunior.com.br/category/it/monitoramento/zabbix/feed/]

Blogger:
[http://nome-usuario-blog.blogspot.com/feeds/posts/default/-/nome-da-categoria]
[http://andredeo.blogspot.com.br/feeds/posts/default/-/Zabbix?alt=rss]

Serendipity:
[http://url-principal-blog/index.php?/feeds/categorias/numerocategoria-nomecategoria]
[http://www.jacksonheraldtoday.com/index.php?/feeds/categories/9-Education-Stories]
[https://www.globalways.net/blog/index.php?/feeds/categories/2-Linux]

Populando o planet com as informações dos blogs:
# cd /var/www/html/planetzabbix
# ./planet.py examples/zabbix/config.ini


Configure o apache para apontar para o diretório:
/var/www/html/planetzabbix/examples/output/

Automatizando o processo de coleta dos dados:
# crontab -e
# Roda a atualização do Planet Zabbix Brasil a cada 10 minutos
*/10    *       *       *       *       /var/www/html/planetzabbix/planet.py /var/www/html/planetzabbix/examples/zabbix/config.ini

Referências:
http://teachingopensource.org/index.php/Planet_Feed_List
https://library.linode.com/web-applications/social-networking/planet/ubuntu-12.04-precise-pangolin
https://github.com/GNOME/planet-web/blob/master/config/gnome-br/config.ini

terça-feira, 7 de maio de 2013

Utilizando o Yum para instalar módulos Perl

Introdução:
Para quem utiliza os descendentes do Red Hat, o yum é velho conhecido, mas para instalar módulos perl eu sempre utilizei o CPAN, achava isso o máximo, até que descobri que posso usar o próprio yum para fazer esse trabalho.

Instalando módulos perl da maneira clássica:
# perl -MCPAN -e shell

cpan> install IO::Socket::SSL
cpan> install Net::SSLeay

Instalando módulos perl via yum:
# yum install 'perl(IO::Socket::SSL)'
# yum install 'perl(Net::SSLeay)'

Como disse o autor do texto original "Agora me sinto como se eu tivesse vivido na idade das trevas".

Referência:
Installing Perl Packages on CentOS - The magic of YUM

Zabbix e passagem de parâmetros

Introdução:
O objetivo deste tutorial é demostrar que através de um único script podemos ter coletas diversas, dinâmicas e sem a necessidade de alteração do script original e reinicialização de serviços (zabbix_agentd e/ou zabbix_proxy).

Entendendo a passagem de parâmetros:
Primeiro uma pequena aula de Shell Script para demonstrar o uso de parâmetros.

Nossos scripts aceitam um numero "ilimitado" de paramentros, basta executar o $*, para comprovarmos esse detalhe:
# cd /usr/local/etc/

# vi zabbix_parametros.sh
#!/bin/bash

echo $*


# ./zabbix_parametros.sh 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20

Na execução acima foram passados 20 parametros e foram exibidos os 20 parametros.

Neste segundo exemplo, demonstro que podemos referenciar apenas 9 parametros por vez:
# vi zabbix_parametros.sh
#!/bin/bash

echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $10


# ./zabbix_parametros.sh 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
01 02 03 04 05 06 07 08 09
010


Na execução acima ao passar o parametro $10, ele reconheceu $1 seguido de 0, por isso o resultado foi 010, que é o primeiro parâmetro (01), seguido de 0, ou seja 010.

Mas usando o shift para eliminar um número X de parâmetros da memória podemos referenciar todos.
# vi zabbix_parametros.sh
#!/bin/bash

echo $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 9
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
shift 9
echo $1 $2


# ./zabbix_parametros.sh 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20
01 02 03 04 05 06 07 08 09
10 11 12 13 14 15 16 17 18
19 20

Como pode ser observado na execução acima, exibi os 9 primeiros parâmetros, eliminei os 9 primeiros parametros da memória (shift 9), exibi os nove primeiros parametros dos que restam na memória, eliminei os 9 primeiros parametros da memoria (shift 9) e exibi os dois primeiros parametros que restam na memória.

Script versão final:
Após essa pequena "aula" de Shell e compreendido como trabalhar com parametros, vamos entender o quanto essa abordagem pode ser produtiva no Zabbix. Vamos a versão final do nosso script:
# vi zabbix_parametros.sh

#!/bin/bash

case $1 in

quant_arq)cd $2
ls -la | grep ^- | wc -l;;

tam_dir)cd $2
du -khs | tr "\t" " " | cut -d" " -f1;;

tam_arq)ls -lh $2 | cut -d " " -f5;;

esac


Primeiramente vamos testar a execução das opções do script:
# ./zabbix_parametros.sh quant_arq /etc
137

# ./zabbix_parametros.sh quant_arq /var/log
51

# ./zabbix_parametros.sh tam_dir /var
24G

# ./zabbix_parametros.sh tam_dir /etc
30M
# ./zabbix_parametros.sh tam_arq /etc/passwd
1.9K

# ./zabbix_parametros.sh tam_arq /var/log/messages
2.0K

Alguns detalhes importantes que temos que observar:
Possuo um único script com 3 funções (quant_arq, tam_dir e tam_arq), mas poderiam ser inumeras funções, de acordo com a necessidade.
Como podemos observar nas funções, graças a passagem de parametros, elas se tornam dinâmicas, podendo retornar a quantidade de arquivos, tamanho de diretório e o tamanho de arquivo, de qualquer arquivo/diretório que nos interesse.

Colocando o Script no Zabbix:
O primeiro passo é alterar o proprietário e grupo do script:
#chown zabbix:zabbix /usr/local/etc/zabbix_parametros.sh

Para utilizar o script no Zabbix, vamos utilizar o UserParamenter:
# cat /usr/local/etc/zabbix_agentd.conf
UserParameter=parametros[*],/usr/local/etc/zabbix_parametros.sh $1 $2 $3 $4 $5 $6 $7 $8 $9

Reinicie o serviço do agente:
# service zabbix_agentd restart
Shutting down zabbix agent:               [  OK  ]
Starting zabbix agent:
                    [  OK  ]

Testando a leitura das informações:
# zabbix_get -s IP -k parametros[quant_arq,/etc]
137

# zabbix_get -s IP -k parametros[quant_arq,/var/log]
51

# zabbix_get -s IP -k parametros[tam_dir,/var]
24G

# zabbix_get -s IP -k parametros[tam_dir,/etc]
20M

# zabbix_get -s IP -k parametros[tam_arq,/etc/passwd]
1.9K

# zabbix_get -s IP -k parametros[tam_arq,/var/log/messages]
2.0K

Conclusão:
Além da vantagem óbvia que é o fato do script se tornar dinâmico,  a outra vantagem, como dito no início, é que eu preciso criar o UserParameter uma única vez, pois o nome do script não muda, apenas o seu conteúdo, logo não preciso reiniciar o agente ou o proxy toda vez que alterar o script.

Basta criar os itens no Zabbix utilizando como chave o que foi passado no comando zabbix_get na opção -k (de Key - Chave em inglês).

Para saber mais:
Passagem de parâmetros em Shell Script;
Case em Shell Script;
UserParameter.

sexta-feira, 26 de abril de 2013

Modem USB Huawei E173 no CentOS 6.2

Introdução:
Esse modem é muito comum e disponível em todas as operadoras do Brasil, a instalação é relativamente simples, mas pode dar muita dor de cabeça se não forem alguns macetes, acredite em mim.

Suprir as dependências:
# yum install libusb usbutils

Instalando o usb_modeswitch a partir dos fontes:
Esse é o macete mais importante, sofri, sofri, sofri, por ter instalado o pacote .rpm, baixe os fontes e compile.

Os pacotes podem ser obtidos em http://www.draisberghof.de/usb_modeswitch/#download. Por exemplo, para a versão no momento em que escrevo esse post, usei os comandos:
# wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-1.2.5.tar.bz2
# wget http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20121109.tar.bz2
# tar -xjvf usb-modeswitch-1.2.5.tar.bz2
# tar -xjvf usb-modeswitch-data-20121109.tar.bz2

# cd usb-modeswitch-1.2.5
# make install
gcc -o usb_modeswitch usb_modeswitch.c -Wall -l usb
install -D -s --mode=755 usb_modeswitch /usr/sbin/usb_modeswitch
install -D --mode=755 usb_modeswitch.sh /lib/udev/usb_modeswitch
install -D --mode=644 usb_modeswitch.conf /etc/usb_modeswitch.conf
install -D --mode=644 usb_modeswitch.1 /usr/share/man/man1/usb_modeswitch.1
install -d /var/lib/usb_modeswitch
install -D --mode=755 usb_modeswitch_dispatcher /usr/sbin/usb_modeswitch_dispatcher

# cd ../usb-modeswitch-data-20121109
# cp 40-usb_modeswitch.rules /lib/udev/rules.d
# cp -r usb_modeswitch.d /usr/share/usb_modeswitch

Conecte o modem.

Verifique se o mesmo foi reconhecido pelo sistema:
# dmesg
usb 1-6: new high speed USB device using ehci_hcd and address 122
usb 1-6: New USB device found, idVendor=12d1, idProduct=1c05
usb 1-6: New USB device strings: Mfr=2, Product=1, SerialNumber=0
usb 1-6: Product: HUAWEI Mobile
usb 1-6: Manufacturer: HUAWEI
usb 1-6: configuration #1 chosen from 1 choice
scsi11 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 122
usb-storage: waiting for device to settle before scanning
scsi12 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 122
usb-storage: waiting for device to settle before scanning
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for GSM modem (1-port)
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
option 1-6:1.0: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB0
option 1-6:1.1: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB1
option 1-6:1.2: GSM modem (1-port) converter detected
usb 1-6: GSM modem (1-port) converter now attached to ttyUSB2


# ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2

Baixar o rpm do Gammu:
Os pacotes podem ser obtidos em http://wammu.eu/download/, você vai precisar baixar dois pacotes gammu e  libGammu. Para a versão no momento em que escrevo esse post, usei os comandos:
# wget http://download.opensuse.org/repositories/home:/Nijel/CentOS_CentOS-6/x86_64/gammu-1.32.0-1.2.x86_64.rpm
# wget http://download.opensuse.org/repositories/home:/Nijel/CentOS_CentOS-6/x86_64/libGammu7-1.32.0-1.2.x86_64.rpm
# yum install gammu-1.32.0-1.2.x86_64.rpm libGammu7-1.32.0-1.2.x86_64.rpm
Segundo macete, usei o yum para instalar os pacotes, pois ele já verifica as dependências no sistema.

Criar o arquivo gammurc:
# vi/etc/gammurc
[gammu]

port = /dev/ttyUSB0
connection = at19200
model = at
synchronizetime = yes
logfile = /var/log/gammu.log
logformat = textalldate
use_locking =
gammuloc =
name=e173s


Testar o modem:
# gammu --identify
Device               : /dev/ttyUSB0
Manufacturer         : Huawei
Model                : E173 (E173)
Firmware             : 21.015.01.03.149
IMEI                 : 35XXXXXXXXXXX15
SIM IMSI             : 72XXXXXXXXXXX76


# echo "Teste de envio" | gammu --sendsms TEXT 9XXXXXX9
If you want break, press Ctrl+C...
Sending SMS 1/1....waiting for network answer..OK, message reference=4


Obs. 9XXXXXX9 é o número do celular para onde a mensagem será enviada.

Agradecimentos:
Agradeço ao meu amigo Éderson Ribeiro (Dérsão), na realidade ele me deu todos os toques importantes, eu quebrei muito a cabeça e não ia, o que eu fiz foi só colocar neste artigo o que ele me ensinou ;-)