sexta-feira, 4 de agosto de 2017

Criando seu próprio LLD com Powershell

Bom Dia!

Após uma necessidade específica de um colega na lista Zabbix Brasil, resolvi fazer este post para dar uma ideia geral de como funciona o recurso de LLD do Zabbix e de como você pode fazer a sua própria regra de descoberta, baseada nas suas necessidades.

Para este exemplo, usarei Powershell, visando os colegas que administram ambientes Microsoft. Você pode usar qualquer linguagem que o seu sistema operacional suporte, haja visto que o script que criaremos será executado pelo próprio host a ser monitorado, e não no servidor Zabbix em si.

O LLD

O recurso de LLD, para quem não sabe, permite que o Zabbix "crie, de forma dinâmica, itens, triggers e gráficos para todos os objetos descobertos no dispositivo monitorado". Você pode encontrar esta definição e mais informações na documentação oficial da ferramenta.

O processo de descoberta automática funciona da seguinte forma: uma rotina é executada e lista os objetos a serem descobertos em uma saída no formato JSON. Baseado nessa saída, os itens, triggers e gráficos serão criados a partir dos protótipos que você criará. Estes protótipos utilizarão as saídas do formato JSON como parâmetros para a criação desses elementos de monitoramento.

A documentação do LLD está bem clara e objetiva. Inclusive, com versão em português.

O Script

Vamos supor aqui que nós precisemos saber o tamanho de cada arquivo existente em uma determinada pasta. Poderiam ser arquivos de um sistema, cujos tamanhos precisam ser monitorados individualmente.

Dica: o Powershell ISE ou o Visual Studio Code são ótimas IDEs para você desenvolver seus scripts.

Primeiro, vamos criar uma forma de listar estes arquivos e o seu tamanho. Para isto, vamos mandar listar os arquivos da pasta simplesmente e ver o que temos em retorno:

Get-ChildItem C:\Temp



Opa! Só com esse simples cmdlet já conseguimos listar os arquivos do diretório e os seus respectivos tamanhos.
Agora vamos testar como fazemos para imprimir somente o tamanho de arquivo específico. Digamos que nós queiramos saber o tamanho do arquivo lalala.zip:

Get-ChildItem C:\Temp\lalala.zip


Conseguimos listar informações do arquivo em questão, mas juntamente com outros dados que não são importantes para o que queremos. Com uma saída dessa forma, não conseguiremos monitorar somente o tamanho. Sendo assim, vamos imprimir somente o tamanho do arquivo em si. Para isto, vamos colocar o comando entre parênteses e fixar que somente queremos os dados referentes à coluna Lenght, que é o tamanho do arquivo.

(Get-ChildItem C:\Temp\lalala.zip).Lenght



Ótimo! Conseguimos então que o script somente imprima o dado que desejamos. Agora temos que encontrar uma forma de que o script trabalhe dinamicamente, de forma que para cada arquivo na pasta, o comando powershell seja diferente.
Para isso nós podemos utilizar o mesmo conceito do shell Linux, que usa as variáveis $1, $2 e assim por diante para os parâmetros que serão passados para um script. A única diferença é que no pwershell esse array inicia-se em 0 com o nome args[x], onde x é a posição do parâmetro a ser informado.
No comando abaixo, por exemplo, abc é $args[0] e 123 é $args[1].

Write-host abc 123


Levando isso em conta, vamos substituir o nome do caminho no script pelo nome da variável $args[0]. Sendo assim, quando executarmos o script passando o nome do arquivo como parâmetro, ele nos trará o dado do arquivo informado. Veja que o início do caminho está fixado, mas poderia ser completamente dinâmico.

(Get-ChildItem C:\Temp\$args[0]).Lenght


Isto posto, salve esse script e execute-o via powershell, passando o nome do arquivo como parâmetro para saber o tamanho do arquivo em questão.

C:\temp\monit-arquivos.ps1 lalala.zip


Estruturando o script

Agora que já sabemos como fazer a coleta dos dados que vamos monitorar, vamos estruturar o script de modo a fazer com que ele tanto faça a descoberta de todos os arquivos na pasta quanto o LLD propriamente dito. Eu, particularmente, gosto da lógica em que caso o script não receba nenhum parâmetro válido, faça o LLD como último recurso.

Sendo assim, vamos estruturar essa rotina de modo a efetuar o monitoramento de um arquivo específico quando eu passar um parâmetro tamanho. Dessa forma, se o primeiro parâmetro ($args[0]) que o script receber for a string tamanho, ele imprimirá o tamanho do arquivo declarado como segundo parâmetro ($args[1]).

A primeira parte do script fica como abaixo.

  # Script para monitorar tamanho de arquivos em uma pasta

  # Se o primeiro parâmetro for a string "tamanho"
  If ($args[0] -eq "tamanho") {
   (Get-ChildItem "C:\Temp\"$args[1]).Length
  }
   

Agora salve o script e execute-o para checar se está funcionando conforme o esperado. Passaremos o primeiro parâmetro como tamanho e o segundo com o nome do arquivo

C:\Temp\monit-arquivos.ps1 tamanho lalala.zip



Ótimo! Agora vamos para a segunda parte, que é onde faremos o LLD propriamente dito. O bloco abaixo varre todos os arquivos do diretório informado e imprime em formato JSON o nome de cada arquivo, identificado pela macro {#NOMEARQUIVO}. Essa macro (que podem ser várias) é uma variável que será utilizada pelo Zabbix para dar nome aos itens, triggers e etc.

   # Se não, efetua LLD
  Else
  {
   # Preenche o array arquivos com a lista de arquivos na pasta
   $arquivos = (Get-ChildItem "C:\temp\").Name
   
   # Define o contador em 0
   $i = 0
   
   # Inicia JSON
   Write-Host "{"
   Write-Host " `"data`":["
   
   # Para cada nome de arquivo
   Foreach ($arquivo in $arquivos)
   {
    # Contador para não imprimir vírgula após o último elemento
    $i++
    
    # Se o nome de arquivo da vez não for vazio
    If($arquivo -ne "") {
     Write-Host -NoNewline "    {""{#NOMEARQUIVO}"":""$arquivo""}"      
     
     # Se não for o último elemento, imprima "," ao final
     If ($i -lt $arquivos.Count) {
      Write-Host ","
     }
    }
   } 
   Write-Host
   Write-Host " ]"
   Write-Host "}"
  }
 

Execute o script para ver a saída em formato JSON, que você pode validar em qualquer validador desses na internet. Aqui usei o JSONLint.




Feito isto, junte as duas partes do script e estamos prontos.
 # Script para monitorar tamanho de arquivos em uma pasta

 # Se o primeiro parâmetro for a string "tamanho"
 If ($args[0] -eq "tamanho") {
  (Get-ChildItem "C:\Temp\"$args[1]).Length
 }
 
 # Se não, efetua LLD
 Else
 {
  # Preenche o array arquivos com a lista de arquivos na pasta
  $arquivos = (Get-ChildItem "C:\temp\").Name
  
  # Define o contador em 0
  $i = 0
  
  # Inicia JSON
  Write-Host "{"
  Write-Host " `"data`":["
  
  # Para cada nome de arquivo
  Foreach ($arquivo in $arquivos)
  {
   # Contador para não imprimir vírgula após o último elemento
   $i++
   
   # Se o nome de arquivo da vez não for vazio
   If($arquivo -ne "") {
    Write-Host -NoNewline "    {""{#NOMEARQUIVO}"":""$arquivo""}"      
    
    # Se não for o último elemento, imprima "," ao final
    If ($i -lt $arquivos.Count) {
     Write-Host ","
    }
   }
  } 
  Write-Host
  Write-Host " ]"
  Write-Host "}"
 }
 


O Host

Feita esta parte, vamos adicionar o script ao arquivo de configuração do host a ser monitorado, criando uma chave monit-arquivos via UserParameter. O parâmetro de usuário nada mais é do que criar uma chave de monitoramento customizada, que quando executada chamará o comando/script declarado no arquivo de configuração.
Encontre o arquivo de configuração do seu host e adicione a seguinte linha (no meu teste estou com script salvo em C:\Temp):

   UserParameter=monit-arquivos[*],powershell.exe -NoProfile -ExecutionPolicy Bypass -file "C:\Zabbix\monit-arquivos.ps1" "$1" "$2"  

Essa tag diz que estamos criando uma chave com o nome monit-arquivos, que aceitará parâmetros ($1 e $2) e que quando chamada executará o comando que está após a vírgula. Caso tenha dúvidas, pesquise sobre os outros parâmetros de powershell que estão sendo utilizados ness alinha.
Note que os parâmetros estão declarados como $1 e $2, que é o padrão do arquivo de configuração do Zabbix. Isso nada tem a ver com a liguagem utilizada no seu script.

Para testar, execute o comando abaixo em um prompt de comando.
powershell.exe -NoProfile -ExecutionPolicy Bypass -file "C:\Zabbix\monit-arquivos.ps1"

Feito isso, salve o arquivo e reinicie o agente do Zabbix no host. Você agora pode testar uma coleta usando este item diretamente do servidor Zabbix, executando o comando abaixo. Note a sintaxe utilizada na chave de monitoramento que criamos.
zabbix_get -k monit-arquivos[tamanho,lalala.zip]

O Zabbix

Agora vamos criar o nosso processo de descoberta. Crie um template novo (ou edite um host) e vá até a aba Regras de Descoberta. Clique na opção Criar regra de descoberta.




Na tela seguinte, dê um nome para a sua regra de descoberta e informe o nome da chave igual colocamos no parâmetro de usuário, no arquivo de configuração do Zabbix. Estamos configurando aqui de quanto em quanto tempo o Zabbix fará o processo de descoberta, que nada mais é que executar o script que criamos sem informar nenhum parâmetro.



Feito isto, vá até a opção de protótipos de itens e adicione o item de monitoramento em si. Aqui adicionaremos a chave que criamos e passaremos os parâmetros que testamos anteriormente.




Agora aguarde o tempo que você estipulou para a coleta e cheque em "Dados recentes" se as coletas estão sendo feitas corretamente. Erros podem ser checados tanto no arquivo de log do agente quanto do servidor.


Espero que este artigo seja útil!

Grande abraço!

segunda-feira, 26 de junho de 2017

Monitorando Cluster Shared Volumes

Olá!

Neste artigo veremos como monitorar os discos de um cluster de failover Microsoft utilizando o LLD do Zabbix. Se você não sabe o que é um cluster de failover, sugiro dar uma estudada aqui.

De modo geral, os discos que são apresentados a um cluster possuem um "dono". Isso quer dizer que a propriedade de leitura e gravação naquele disco é de um dos nós do cluster, e somente dele. Com o recurso de CSV (Cluster Shared Volumes), ou volumes compartilhados do cluster, é possível que dois ou mais nós do cluster gravem dados em um mesmo volume ao mesmo tempo. Isso também agiliza o processo de failover, pois não é necessária a montagem e desmontagem do volume para a troca de propriedade. Mais informações sobre CSV aqui

Um dos pequenos "problemas" de se usar CSV é que o cluster simplesmente consome o volume e direciona-o para um diretório em C:\ClusterStorage\VolumeX, com X sendo incrementado a cada novo volume adicionado aos CSV.

Levando em conta que não poderíamos simplesmente monitorar os discos naturalmente através das chaves padrão do Zabbix (pois os discos não "existem" mais!), só nos restou desenvolver um script para coletar estes dados de forma dinâmica, através do LLD. Você pode baixá-lo aqui. Depois de baixá-lo, salve-o em um diretório de sua escolha.



1) Testando o script


A maioria dos scripts que acabo criando para fazer LLD fazem a descoberta quando executados sem parâmetro algum. Quando executado dessa forma, lista todos os discos CSV do seu cluster e formata a saída em formato JSON, utilizando a macro {#VOLNAME} para cada disco descoberto. É com base no valor dessa macro que o nome do disco será adicionado ao item de monitoramento e depois também utilizado nas coletas.
C:\caminho\do\seu\script\MonitorCSV.ps1

Acima vemos que o script encontrou somente 1 disco adicionado ao cluster em modo CSV.

Explore o script para descobrir que ele aceita 4 argumentos: used, free, pfree e total. Por exemplo, se quiser saber o tamanho total do disco 11, execute o comando a seguir:
C:\caminho\do\seu\script\MonitorCSV.ps1 "Cluster Disk 11" total


2) Adicionando o script ao Zabbix

Eu disponibilizei um template aqui para monitoramento, mas abaixo segue como criar a regra de descoberta:


  • a) Primeiro vamos criar a regra de descoberta em si, que consumirá os dados gerados no arquivo JSON. Isto processará periodicamente todos os volumes disponíveis. Caso um novo seja encontrado, os itens serão criado também para este novo item.



  • b) Agora criaremos os itens. Abaixo segue os detalhes de cada item que criei. O LLD criará novos itens iguais a esse para cada volume que encontrar.




  • c) Agora criaremos os protótipos de trigger em seguida gráficos:




Dessa forma, todos estes elementos serão criados para cada novo disco adicionado de forma dinâmica, sem a necessidade de ter que criá-los manualmente.

Espero que seja útil.

Grande Abraço!

quarta-feira, 21 de junho de 2017

Zabbix Monitorando SIP no Asterisk

Neste post vamos apresentar como monitorar uma linha SIP com o zabbix usando o “UserParameter”, para isso será necessário o zabbix_agent no servidor asterisk, após configurar a ponta do cliente, vamos usar o zabbix_get e assim validar antes de configurar o item e a trigger para alertar no e-mail quando a linha estiver off-line. Lembrando que todos os procedimentos postados são testados em máquinas (VMs) de laboratório e muitas vezes pode sim mudar o caminho de alguns arquivos binários ou confs, não interferindo no resultado final, sempre positivo.

O primeiro passo é entrar no arquivo de configuração "sudoers" para dar permissão ao usuário zabbix,desta forma ele consegue fazer a consulta no asterisk, sem isso o zabbix_server não consegue fazer a consulta.

[root@srvzabbix ~]# vim /etc/sudoers
Defaults:zabbix !requiretty
Cmnd_Alias ZABBIX_CMD = /usr/sbin/asterisk
zabbix   ALL = (other_user)  NOPASSWD: ALL
zabbix   ALL = (root)        NOPASSWD: ZABBIX_CMD

Agora vamos entrar no arquivo “zabbix_agentd.conf” e adicionar o parâmetro que vai consultar no asterisk o status da linha sip, complementando também adicionaremos a linha “EnableRemoteCommands=1” que assim conseguimos do zabbix server executar comandos remoto no zabbix_agent.

# vim /usr/local/etc/zabbix_agentd.conf
ListenPort=10050
StartAgents=3
ServerActive=192.168.1.10
LogFile=/tmp/zabbix_agentd.log
Hostname=ZabbixCliente
Timeout=3
UnsafeUserParameters=1
EnableRemoteCommands=1
UserParameter=coletasip[*],sudo asterisk -rx 'sip show registry'|grep "$1"|cut -c 71-91

Simplificando, o comando “sudo asterisk -rx 'sip show registry' | grep "$1" | cut -c 71-91” nada mais que você executar o comando abaixo no asterisk.

Asterisk -rx ‘sip show registry’ | grep “1121990999” | cut -c 71-91

Resultado será “Registered” ou “unreachable” etc... A ideia é que a coleta seja feita e se caso o valor for diferente que “registered”, alertar no e-mail.

[root@srvzabbix ~]# zabbix_get -s 192.168.1.X -k coletasip[1121990999]
Registered
Acima validamos que o servidor zabbix está apto a fazer a coleta no cliente, agora partimos para o Item que vai fazer a coleta com o tempo determinarmos.

Criando Item:


Analisando a coleta dos dados:


Obserse que o ultimo valor coletado foi "registered".

Histórico de coletas:


Assim que o zabbix receber um valor que for diferente que registrado ele vai tomar uma ação, que é o que vamos fazer a seguir, criar a trigger.

Criando Trigger:


No meu caso eu utilizo a trigger para analisar as ultimas 3 coletas se são diferentes que "registered" ele me envia um alerta.

Agora que a Trigger foi criada, vamos simular a falha na linha SIP, eu mudei o gateway da maquina somente para simular uma queda de link.

Linha Fora:


Zabbix coletando os valores:


Observe que em seguida a linha já fica online, neste período eu já voltei o gateway e normalizou.

Zabbix identificando os Eventos:


E-mail de alerta recebido:


Bom pessoal acredito que finalizamos esse post por aqui, e lembre-se com Zabbix o "Shell" é o limite. Abraços!

Abaixo o Link do site Udemy, aonde encontra treinamentos Zabbix ministrado pelo nosso amigo Janssem, vale apena conferir. Acesse Já com desconto!

Faça parte também da nossa comunidade Zabbix Brasil.

terça-feira, 13 de junho de 2017

Usando Zabbix para monitorar seu ambiente Unifi

Boa Tarde!

Neste post vou tentar dar o caminho das pedras para quem tem um ambiente com antenas Unifi e deseja saber a saúde desses dispositivos.

Para os afobados que querem somente o script, pode baixá-lo aqui. E o template aqui.

Para quem não sabe, Unifi são os pontos de acesso da Ubiquiti, focados para ambiente empresarial, com a possibilidade de ter um controlador centralizado. Através deste controlador você configura os seus pontos de acesso, podendo separá-los por sites, com configurações específicas para cada ambiente.

Neste procedimento, monitoraremos a quantidade e o status das antenas já previamente adicionadas ao seu controlador. O exemplo aqui é feito com um Unifi Controller instalado em um Debian 8 x64.
Posto isto, mãos à obra:

1) Acesse seu controlador via ssh e baixe os arquivos do github. Ou use outra estação para baixar e copie os arquivos para dentro da sua máquina onde está seu controlador. O que preferir.


2) Copie o arquivo unifi.sh para /etc/zabbix/ e  unifi_sh_api para /usr/lib/unifi/bin/


3) Edite o arquivo unifi_sh_api, informando os dados do seu ambiente. Este ambiente é carregado toda vez que unifi.sh é chamado, e contém todas as configurações para login do script na aplicação para coleta dos dados.
username=
password=
baseurl=https://
site=default


4) Para testar o funcionamento do script, vamos executá-lo:
/etc/zabbix/unifi.sh

Executando descoberta

Veja que o retorno foi uma saída em formato JSON, que é o formato que o Zabbix utiliza para fazer o LLD, que é o processo de descoberta de itens de monitoramento, de forma dinâmica. Entenda mais sobre LLD aqui.

Caso queiramos outras informações a respeito de um site específico, devemos informar o nome do site e a informação que desejamos. É possível saber quantos APs temos ao total, offline e online.
Por exemplo, caso queira saber o total de pontos de acesso no site default, execute o comando abaixo:

/etc/zabbix/unifi.zabbix default total

A saída será a quantidade total de dispositivos.

Coletando valores de site específico


5) Agora vamos editar o arquivo de configuração do Zabbix, adicionando um parâmetro de usuário. Um parâmetro de usuário nada mais é do que uma forma customizada de uma chave de monitoramento. É uma chave que criaremos por conta para fazer um tipo de de coleta que nos interessa.
Essa é uma das melhores sacadas dessa solução, ao meu ver. É possível monitorar qualquer dado, desde que ele seja passível de coleta de alguma forma. Entenda mais sobre parâmetros de usuário aqui.

Vamos adicionar ao final do arquivo de configuração do Zabbix a configuração desse novo parâmetro de usuário. Se você leu a documentação, já deve saber que informa-se o nome da chave e depois o comando que ela executará, separado por vírgulas.
Execute o comando abaixo ou use o seu editor de texto preferido para criar a nossa nova chave:
echo 'UserParameter=unifi[*],/etc/zabbix/unifi.sh $1 $2' > /etc/zabbix/zabbix_agentd.conf

Para checar se o comando funcionou, execute o comando abaixo. O retorno deve ser o conteúdo do echo que executamos acima.

cat /etc/zabbix/zabbix_agentd.conf | grep ^UserParameter>
$1 e $2 são a declaração dos parâmetros que essa chave pode receber.

Isto feito, reinicie o serviço do agente Zabbix.

service zabbix-agent restart


6) Agora vamos testar através do Zabbix. Acesse seu servidor Zabbix via ssh e então vamos tentar coletar os dados manualmente.
Primeiramente tente executar o LLD:

zabbix_get -s SERVIDOR_UNIFI -p PORTA -k unifi

Agora tentemos coletar a quantidade de pontos de acesso no site default:

zabbix_get -s SERVIDOR_UNIFI -p PORTA -k unifi[default,total]


7) Finalmente, adicionaremos os itens ao Zabbix. Crie um novo template (ou configure direto em um host, como preferir) e vá em Regras de Descoberta e adicione uma nova regra conforme abaixo:

Criando regra de descoberta

Esta regra faz com que seja gerado o processo de descoberta periodicamente. Para o meu ambiente estipulei que a cada 6 horas é um bom número.
Após isto, vamos criar os itens em Protótipos de Itens:

Visão geral dos protótipos de item

Detalhes de um protótipo de item


Veja que agora montamos a chave inteira do Zabbix, usando a macro do site que é gerado na saída JSON. Dessa forma o processo irá criar um item deste para cada site encontrado na regra de descoberta.

Se tudo der certo, crie seus outros itens conforme a sua necessidade. No mesmo diretório onde estão os scripts eu disponibilizei um template para os dados abordados nesse tutorial.

Espero que possa ser útil.

Grande Abraço!

quinta-feira, 8 de junho de 2017

Apresentação

Boa Noite!

O intuito desse blog é compartilhar com os colegas scripts que desenvolvemos para automatização de processos e informações sobre monitoramento utilizando Zabbix.

Esperamos que seja possível ajudar outras pessoas nem que seja com o mínimo de informação útil.