Introdução
Algumas operações realizadas pela equipe de infraestrutura envolve não apenas ação humana, mas também o acompanhamento de algo para que determinada ação deva ocorrer. Este processo vem sendo facilitado por inúmeras ferramentas, que apresentam soluções praticamente autônomas.
Em projetos novos, é comum nos depararmos com situações específicas em que a automatização de tarefas resolve um grande “buraco”. Neste post, venho demonstrar como executar scripts a partir do disparo de triggers do Zabbix, que pode ser absolutamente qualquer coisa. Este processo envolve apenas as opções nativas do Zabbix, que é “for free” 💸💸💸.
Let’s do it
A primeira etapa é ter algo para observarmos. Vamos utilizar um Item dentro do Zabbix. Esse item pode ser qualquer coisa: alguma métrica de algum host, algum atributo e até alguma informação externa.
No exemplo, irei utilizar o seguinte exemplo:
- Monitorar uma URL (CNAME do host) e acompanhar o endereço de IP. Caso o IP altere, uma trigger é disparada e um script (comando externo) é executado.
É algo simples, mas pode ser bem útil.
Portanto, o item que irei utilizar é um script externo que faz a resolução CNAME > A. Você pode aprender mais sobre os tipos de registros de DNS nesse link.
Item
No servidor onde o Zabbix está em execução, normalmente os scripts externos ficam localizados no diretório /usr/lib/zabbix/
.
Irei criar um script bash chamado get_ip.sh
:
touch /usr/lib/zabbix/externalscripts/get_ip.sh
O conteúdo é um código bash simples, que busca o IP (registro A) de uma URL:
#!/usr/bin/bash
# Verifica se foi fornecido um argumento
if [ $# -ne 1 ]; then
echo "Usage: $0 <hostname>"
exit 1
fi
# Armazena o hostname fornecido como argumento
host=$1
# Resolve o hostname para endereços IP e faz o sort
ips=$(dig +short $host | sort)
# Exibe os endereços IP encontrados
if [ -z "$ips" ]; then
echo "No IP addresses found for $host"
else
# Substitui a quebra de linha (caso tenha mais de um IP) para vírgula
echo "$ips" | tr '\n' ',' | sed 's/,$//'
fi
Não esqueça de aplicar as permissões necessárias para o usuário zabbix
conseguir executar:
# torna o arquivo executável
chmod +x /usr/lib/zabbix/externalscripts/get_ip.sh
# altera o owner para o zabbix
chown zabbix:zabbix /usr/lib/zabbix/externalscripts/get_ip.sh
Agora, vamos configurar o item na interface do Zabbix. Você pode fazer a criação diretamente no host, porém, é interessante utilizar os templates do Zabbix, que pode ser adicionado em N hosts. Não demonstrarei nesse tutorial, mas verifique a documentação sobre os templates.
Neste caso, nosso item irá utilizar o script get_ip.sh
.
Repare que utilizei o tipo
External Check
, e a chaveget_ip.sh[{$HOST.CNAME}]
. O tipo retornado éText
, e o intervalo de coleta é a cada 2 minutos.
Basicamente, estamos dizendo que o nosso item vai ser o resultado da execução do script get_ip.sh
, passando como parâmetro a propriedade CNAME
do nosso HOST
, que será o host associado com o template que criamos.
Host
Agora, vamos criar o host e associar o template criado. Como adicionamos o script no próprio servidor Zabbix, utilize um host com o apontamento (seja o IP ou o CNAME) para o próprio server.
Lembre de ter o zabbix-agent2 instalado, configurado e em execução na máquina do Zabbix server, assim você pode usar o localhost (127.0.0.1) e a porta 10050.
Agora, precisamos também configurar a propriedade HOST.CNAME
, que será utilizada no item. Faça a criação na aba Macros
:
Ao salvar, se tudo ocorrer bem, a coleta do IP será efetuada a cada 2 minutos. Você pode observar os dados na seção Latest Data
.
Trigger
Com o item sendo coletado corretamente, vamos criar a trigger, que é o gatilho para a execução do comando externo:
Estou utilizando uma expressão bem básica, que apenas detecta a mudança. Você pode pesquisar e criar expressões mais avançadas, se desejar.
Nesse momento, já estamos com o alerta funcional da mudança do IP. Vamos partir para a execução do script a partir desse alerta.
Scripts
Nosso objetivo é executar um script (comando externo) assim que a trigger for disparada. Precisamos primeiro cadastrar esse comando na aba “Scripts” do nosso servidor Zabbix (Administration > Scripts). No meu caso, executarei um script em Python que atualiza as rotas de alguns servidores de VPN, utilizando o IP do host.
Lembre-se: Este comando pode ser absolutamente qualquer coisa, dependendo da sua necessidade. Não irei disponibilizar o script que utilizo pois não é o objetivo deste post.
Importante: Para a execução automática, selecione o escopo
Action Operation
.
Trigger Action
Para finalizamos, vamos criar a ação da trigger, que vai ser executada no disparo. Acesse pelo caminho Configuration > Actions > Trigger actions. Crie uma nova Action e adiciona a trigger criada como condição:
Na aba Operations, adicione uma operação selecionando o script que criamos anteriormente:
No Target list, marque a opção Current host
.
E pronto! Assim que o item (CNAME da URL) monitorado mudar de IP, a trigger irá disparar o script com o comando.
tchau! =)