terça-feira, 7 de maio de 2013

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.

7 comentários:

Elton Ferreira disse...

Parabens, muito bom o material!

anonymous disse...

Muito bom, muito mesmo...

Periano Catani disse...

Estou com um problema pessoal, quando dou o comando zabbix_get eleme retorna os dados tudo certinho, mais no frontend o item nao apresenta nada, fala que é não suportado, criei o item correto com a chave que passo pel get, o que sera?????

André Déo disse...

Obrigado Elton e Anonymous ;-)

Abraços,

André Déo disse...

Periano,

Provavelmente o tipo de dados está incorreto.

Abraços,

Marcao disse...

Bom dia Déo.... Ótimo post.. Meu nome é Marcos Otoni.

Gostaria de ver contigo... um problema que estou tendo em relação a visualizar os parâmetros.... gero um evento no zabbix...

Ex.
/usr/local/bin/yowsup-cli demos -c $DIR/conf_wats -s "$1" "$2"

echo "$1"
echo "$2"
echo "$3"


Isso com os alertas de testes ja ativos.... o que pode ser... tem onde ativar esses parametros no zabbix??

desde ja agradeço

André Déo disse...

Marcos,

Se eu entendi o que você quer fazer é no UserParameter passar a linha:

/usr/local/bin/yowsup-cli demos -c $DIR/conf_wats -s "$1" "$2"

E depois vc quer saber de onde vem o $1 e $2...

Bom quando você define o UserParameter, você define o nome da chave.

Na hora de criar o item na interface gráfica você vai colocar nome da chave param1 param2

O valor de param 1 e param2 substituem o $1 e $2.

Abraços,