Diário de Viagens e Trabalhos do Pajé
21mai/1029

Monitorando Backup’s do Bacula no servidor Zabbix

Mais um documento sobre o Zabbix.

Introdução

O objetivo deste trabalho é desenvolver um documento para auxiliar os colaboradores da empresa onde trabalho, na customização do Zabbix na monitoração dos backup's realizados pelo servidor Bacula. A necessidade é obter um dashboard único de monitoração contemplando todos os eventos do ambiente.

Entendendo as configurações

Esse documento parte do pressuposto que já existe em operação no ambiente os servidores Zabbix, e Bacula, que serão ajustados para realizar a nova função.

Não existe necessidade de instalação de aplicativos ou serviços adicionais.

O fluxo da monitoração se resume na configuração do servidor Bacula para enviar as mensagens do bconsole, após o backup, não só para os logs mas também para o servidor Zabbix.

Para que isso aconteça, é utilizado um script escrito em perl, que coleta essas informações e envia ao servidor Zabbix através do "zabbix trapper", onde items e triggers se encarregam de formatar os dados e exibir para os operadores.

Esse procedimento foi implementado utilizando Debian GNU/Linux lenny, Bacula 3.0.2-3 backports e Zabbix 1.8.2.

Ajustando o servidor Bacula.

Para começar, faça donwload do script zabbix_bacula.pl, extraia, permissione e mova para o diretório /usr/local/bin.

# # tar -xzvf zabbix_bacula.tar.gz
# chmod 755 zabbix_bacula.pl
# chown root:zabbix zabbix_bacula.pl
# mv zabbix_bacula.pl  /usr/local/bin/

OBS: Edite o script e veja se o caminho para o zabbix_sender está correto.

my $zabbix_sender = "/usr/local/bin/zabbix_sender";

São duas as alterações necessárias no Bacula Director. Sendo assim, edite o arquivo conforme o exemplo abaixo e configure os campos.

# vi /etc/bacula/bacula-dir.conf

Na configuração das mensagens, adicione/modifique os valores:

mailcommand = "/usr/local/bin/zabbix_bacula.pl %r %c"
mail = zabbixserver.paje.net.br = all, !skipped

As configurações do Messages, servem para dizer como e para onde serão enviadas as mensagens do bconsole no servidor Bacula após os backup's. Neste caso, o campo mailcommand configura o path do script que customizamos, bem como os parâmetros para a execução, já o campo mail configura o host do servidor Zabbix e parâmetros. Mais informações veja no manual do bacula.

Nota: Cheque se o hostname ou DNS name configurado resolve corretamente o nome. Por padrão existem dois tipos de mensagens configuradas, o Standard e Daemon. Tenha certeza que na configuração do Job no Bacula client, o campo Messages corresponda com a configuração realizada.

OBS: É necessário que o campo Name tenha o mesmo valor tanto na configuração do host no Zabbix, quanto na configuração do cliente Bacula. Reinicie o serviço Bacula Diretor e se tudo ocorrer bem, seu servidor está ajustado.

Ajustando o servidor Zabbix

Todos os ajustes do Zabbix devem ser realizados através da interface Web. Logado, siga até a tela de configuração de itens: Configuration > Hosts No combo box localizado no canto superior direito, selecione Templates e abaixo, em Group, selecione em Templates .

Figura 01: Tela de configuração dos templates

Os items e triggers que estamos adicionando foram inseridos dentro do Template Linux, sendo assim clique em itens do Template Linux e na próxima tela no botão Create Item

.

Figura 02: Botão "Create Itens"

É necessário criar 8 items e triggers. Porém será exemplificado a criação a trigger bacula.backup.result que serve como exemplo para a criação das outras.

Figura 03: Tela para criar itens

Crie agora que temos o item configurado, crie a trigger através do botão "Create Trigger" e na expressão, aponte para o item criado, no campo Function selecione last value > N e N coloque 0 (zero).

Figura 04: Tela para criar triggers

Com base no itemtrigger criados anteriormente, crie as outras 7 utilizando os parâmetros abaixo:

Nome da trigger Items e Key de monitoração Valor de retorno
Bacula backup result bacula.backup.result 0 = OK ou OK -- with warnings e 1 = Erro
Bacula FD Byteswritten bacula.fd.byteswritten 2.95 MBytes
Bacula FD Fileswritten bacula.fd.fileswritten 7 bytes
Bacula SD Byteswritten bacula.sd.byteswritten 2.95 MBytes
Bacula SD Fileswritten bacula.sd.fileswritten 7 bytes
Bacula last volume bytes bacula.lastvolumebytes 11789564846
Bacula verify filesexamined bacula.verify.filesexamined ----
Bacula verify result bacula.verify.result ----

OBS: Na criação dos itens bacula.fd.fileswritten e bacula.fd.byteswritten , configure o campo Units com o valor Bytes . Os valores das triggers bacula.verify.filesexamined e bacula.verify.result não foram testados.

Referências/Agradecimentos

Sites

http://www.zabbix.com/forum/showthread.php?t=8145

http://www.bacula.org/en/dev-manual/main/main/Messages_Resource.html


Agradecimentos

Ao amigo da comunidade Zabbix milprog, por escrever o cookbook utilizado como base neste trabalho e auxiliar nos momentos de dúvida. Thank you again...

Comentários (29) Trackbacks (0)
  1. Boa tarde,

    Estou seguindo o seu manual para o monitoramento do bacula atraves do zabbix e gostaria de saber se preciso declarar algum UserParameter no arquivo de configuração do agente (agentd.conf). Pois já utilizou alguns scripts e tive q colocar os parameters…

    Obrigado pela atenção.

    Renato

  2. Boa tarde Renato.
    Na realidade não é necessário porque o Bacula, ao finalizar um backup, envia uma mensagem via Zabbix Trap ao Zabbix Server. Utilizar UserParameter serviria para o Zabbix Server buscar no host as informações (polling).
    Abraços.

  3. Obrigado pela atenção.

  4. Olá! Fiz o que falou e não deu certo. Gostaria de saber o que você quis dizer nessa parte:

    “OBS: É necessário que o campo Name tenha o mesmo valor tanto na configuração do host no Zabbix, quanto na configuração do cliente Bacula. Reinicie o serviço Bacula Diretor e se tudo ocorrer bem, seu servidor está ajustado.”

    Meu campo Name é Mensagens, onde isso implica na configuração do Zabbix?

    Obrigado! Ótimo blog!

  5. Obrigado pelo comentário.
    Em resumo é o seguinte: O campo onde é definido o nome do equipamento que será bacapeado, quando configurado no Bacula, deve ser exatamente o mesmo nome que será utilizado na configuração do host no Zabbix server. Se o nome utilizado foi “servidor01″ no Bacula, deve ser utilizado o mesmo nome no host do Zabbix.
    Abraços.

  6. Ah sim! Entendi. Então… eu monitoro os serviços Bacula com UserParameters e recebo os dados normalmente. Então creio que o monitoramento entre Bacula > Zabbix está correto. Agora estou com problemas neste script. Eu executo o backup e não recebo nada no Zabbix. Meu arquivo bacula-dir.conf está assim:

    Messages {
    Name = Mensagens
    syslog = all, !skipped, !saved
    mailcommand = “/usr/local/bin/zabbix_bacula.pl %r %c”
    mail = “192.168.2.114” = all, !skipped
    }

    O script está com permissão e segui seus passos creio que corretamente. Será que pode me ajudar?

    Muito Obrigado por ter respondido minha pergunta!
    Desculpe qualquer incomodo mas isso seria muito util para mim.

    Abraços!

  7. Grande Marcos… vamos lá.
    Esse “Name = Mensagens” que foi configurado deve constar em outros locais.
    Ex:
    Na configuração do “JobDefs”, o campo “Messages” deve ter o valor = “Mensagens”;
    Na configuração do “Job”, para todas as politicas e de todos os hosts, o campo “Messages” deve ter o valor = “Mensagens”.
    Veja isso pois se estiver configurado o valor padrão que é “Standard” não vai funcionar.
    Abraços,

  8. Hi!

    I just followed your blog in monitoring Bacula Server’s Backup Results using Zabbix Monitoring Server but I’m encountering a ZBX_NOTSUPPORTED result. I tried to telnet to the Zabbix agent of the Bacula Server (Bacula Director, Bacula SD and Bacula FD are installed on the same server) and typed bacula.backup.result and it returned the ZBX_NOTSUPPORTED. After that test, I checked the Zabbix server’s web interface and all the Bacula items are now having a “Not supported” status. Please help ASAP. I need to make this work.

    Here’s my setup and config.

    I placed the zabbix_bacula.pl on /usr/bin/ directory.
    zabbix_sender file is located at /usr/local/bin/ directory.

    bacula-dir.conf:

    mailcommand = “/usr/bin/zabbix_bacula.pl %r %c”
    mail = zabbix.domain.com = all, !skipped

    zabbix_bacula.pl:

    my $zabbix_sender = “/usr/local/bin/zabbix_sender”;

    Zabbix Agent version: 1.8.10

  9. How I will check if the zabbix trappers are able to get the sent data by zabbix_bacula.pl?

  10. Hi,

    This is Christian again. It appears that zabbix_bacula.pl is not sending trapper updates to Zabbix upon checking the “Latest Data”. No data was recorded for the Bacula Zabbix items defined on Zabbix server.

  11. Hi Christian.
    Sorry for the delay. Try to send manually trap to Zabbix Server.
    On your Bacula Server, execute this command:
    zabbix_sender -z ZABBIX_SERVER_IP -s NAME_OF_HOST -k bacula.backup.result -o 1

    This command send a trap to Zabbix Server and active trigger Bacula Backup Result. For disable alarm, execute:
    zabbix_sender -z ZABBIX_SERVER_IP -s NAME_OF_HOST -k bacula.backup.result -o 0

    Thanks…

  12. Hi!

    Thanks for the command. I just executed the command and now, Zabbix items were able to get the data from zabbix_sender manually. But I have a question. Why after a Bacula backup job has been done, there’s no sent data to Zabbix server through zabbix_sender? I just followed your blog and it appears that zabbix_bacula.pl is not working. How should I able to test the zabbix_bacula.pl script if it is working fine?

    Here’s my setup.

    I placed zabbix_bacula.pl on /usr/local/bin/ directory.
    I executed chmod 755 zabbix_bacula.pl.
    I executed chown root:zabbix zabbix_bacula.pl.

    zabbix_sender file is located at /usr/local/bin/ directory.
    I executed chmod 755 zabbix_sender.
    I executed chown root:zabbix zabbix_sender.

    bacula-dir.conf:

    Messages {
    Name = Standard
    mailcommand = “/usr/local/bin/zabbix_bacula.pl %r %c”
    mail = zabbix.domain.com = all, !skipped
    }

    zabbix_bacula.pl script:

    #!/usr/bin/perl
    #
    # process bacula termination message and generate zabbix events
    #
    use strict;
    use warnings;

    my %term_backup = (“OK”, “0” , “OK — with warnings”, “1”);
    my %term_verify = (“OK”, “0” );

    my $zabbixserver = $ARGV[0];
    my $hostname = $ARGV[1];
    my $zabbix_sender = “/usr/local/bin/zabbix_sender”;

    print “Server=”, $zabbixserver, “\n”;
    print “Host=”, $hostname, “\n”;

    while () {
    if (/Termination:\s*Backup\s*/) {
    my $term = $'; chop($term);
    if (exists($term_backup{$term})) {
    $term=$term_backup{$term};
    } else {
    $term=”2″;
    };
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.backup.result -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/Termination:\s*Verify\s*/) {
    my $term = $'; chop($term);
    if (exists($term_verify{$term})) {
    $term=$term_verify{$term};
    } else {
    $term=”2″;
    };
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.verify.result -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/FD Files Written:\s*/) {
    my $term = $'; chop($term);
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.fd.fileswritten -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/SD Files Written:\s*/) {
    my $term = $'; chop($term);
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.sd.fileswritten -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/FD Bytes Written:\s*/) {
    $_ = $'; /[0-9,]+/; $_ = $&; s/,//g;
    my $term = $_;
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.fd.byteswritten -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/SD Bytes Written:\s*/) {
    $_ = $'; /[0-9,]+/; $_ = $&; s/,//g;
    my $term = $_;
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.sd.byteswritten -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/Last Volume Bytes:\s*/) {
    $_ = $'; /[0-9,]+/; $_ = $&; s/,//g;
    my $term = $_;
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.lastvolumebytes -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    } elsif (/Files Examined:\s*/) {
    $_ = $'; /[0-9,]+/; $_ = $&; s/,//g;
    my $term = $_;
    my $cmd = $zabbix_sender.” -z “.$zabbixserver.” -s “.$hostname.” -k bacula.verify.filesexamined -o “.$term;
    print $cmd, “\n”;
    my $return = `$cmd`;
    }
    ;
    }
    exit 0;

    Did I forget something?

    Please help.

    Thanks.

  13. Hello.

    Here this script works fine. On the last week I change some lines in this script because after upgrade my Bacula server, the trigger Bacula Backup Result no increment more. But others triggers works normally.

    OK. Now try to change some lines in zabbix_bacula.pl.

    This:
    my %term_backup = (“OK”, “0” , “OK — with warnings”, “1”);
    To:
    my %term_backup = (“OK”, “0” , “OK — with warnings”, “1”, “*** Backup Error ***”, “1”);

    And this:
    if (/Termination:\s*Backup\s*/) {
    To:
    if (/Termination:\s*/) {

    Try again to make a new backup, then your bacula server go to send another trap to Zabbix Server and give me a feed back.

    Thanks.

  14. Hi!

    It still did not work. No trap data was received on Zabbix server.

    Let me clarify something. May be I’m doing something wrong on my setup.

    I have a Bacula server (with Director, SD and FD installed). I am backing up two remote email servers (with Bacula FD installed on each servers) which I like to monitor if Backup jobs are successful on Zabbix server. Then, I have a Zabbix server that will monitor their status and will get the trap data. What I have done is I have configured the Bacula server (Director configuration) to use zabbix_bacula.pl script to send trap data to Zabbix server. The zabbix_bacula.pl script is installed on Bacula server. Do I still need to install zabbix_bacula.pl on my two email servers too? Please let me know if I have something wrong on my setup.

    Thanks for your help.

  15. Hi!

    Have you receive my last comment? I was still not able to make it work. I posted yesterday my current setup and how the scenario goes on my setup. I’ll wait for your reply.

  16. Hi guy.
    This is the flow:
    The bacula server, when the backup is finish, send a message to the log file. When you change message on bacula directory, the default output is send to perl script and checked.
    Your setup is:
    Messages {
    Name = Standard
    mailcommand = “/usr/local/bin/zabbix_bacula.pl %r %c”
    mail = zabbix.domain.com = all, !skipped
    }
    Then, the name of messages is “Standard” ok. Now, in your client configuration, do you have: “Messages = Standard” ?
    You need to setup this entry “Messages = Standard” on your JobDefs and all Job clients configurations.
    Try this and give me a feedback ok.

    Thanks.

  17. Hi!

    Yes, all file daemon client configurations and Job clients’ configurations are having Messages = Standard.

    Please help me troubleshoot it and find the failing part.

    I would also like to verify the set permission and ownership for zabbix_bacula.pl and zabbix_sender. I think there might be a problem between them. It’s just my guess.

    Your help is greatly appreciated.

    Thank you.

  18. Why my last post was not appearing now? Have you receive my reply?

    Please help me on my case.

    I have checked all the configs and all are OK as you have advised me.

    What other things are the possible causes why it doesn’t send trap data to Zabbix server?

  19. Hi!

    Did you receive my last feedback? I checked all my configs and they are all OK based on what you have advised me. I’m still having problems with. The trap data are not yet forwarded or sent by zabbix_bacula script.

  20. Bom dia!

    Primeiramete queria te parabenizar pelo exelente post. Esse monitoramento era o que me faltava, e esta muito bem explicado.

    Eu coloquei aqui para mim e funcionou muito bem. Porem meu ambiente tem muitos jobos de servidores ele faz backup localmente (servidor do bacula) e tambem remoto (pela rede).

    So que o script me manda somente a informação do job de backup local. Você saberia como eu faço para eu monitorar o total dos jobs de backup ou os jobs de backup individualmente?

    Desde já agradeço a ajuda.

  21. Bom dia Marcelo.
    Obrigado. São esses comentários que me motiva a continuar pesquisando e escrevendo.
    Já quanto a sua pergunta não entendi direito. O script pega o output do bconsole, que seria enviado via email ou diretamente ao log, avalia um trecho via expressão regular e se as condições forem verdadeiras, ele roda um comando, zabbix_sender, que gera um trap para o servidor Zabbix alimentando o item em questão.
    Se não está sendo gerado o trap, o que pode estar acontecendo é que a mensagem de output do job deve estar direcionada para outro caminho e não para a checagem via script. Veja se não tem um “Message” personalizado para os jobs que não estão funcionando.
    Abraços.

  22. Pajé, Obrigado pela sua resposta.
    Realmente acho que nao fui muito claro na minha duvida., mas ja tinha resolvido meu problema. Em meus jobs nao tinha o “Message” e tive que criar um conf de message e colocar nos jobs a linha “Message = NOME_DO_MESSAGE”. E com isso resolveu o meu problema.

    Agora so tenho outra duvida, em um unico job/servidor o key bacula.backup.result esta enviando ao zabbix server o valor “1 (erro)” porem olhei o bconsole e os logs e estão dizendo que o backup esta OK.
    Isso pode ser algum erro de configuração na hora de enviar o zabbix-sender que esta enviando o valor “1” ou pode ser erro do meu backup causando um falso-positivo??

    Obrigado

  23. Salve Marcelo.

    Tente mudar os seguintes parâmetros no zabbix_bacula.pl:
    Mude de:
    my %term_backup = (“OK”, “0″ , “OK — with warnings”, “1″);
    Para:
    my %term_backup = (“OK”, “0″ , “OK — with warnings”, “1″, “*** Backup Error ***”, “1″);
    E mude de:
    if (/Termination:\s*Backup\s*/) {
    Para:
    if (/Termination:\s*/) {

    Depois tente executar novamente. Isso deve resolver o problema.
    Abraços.

  24. Pajé, bom dia!!!
    Fiz a alteração no script como você informou, porem apos o backup a key bacula.backup.result esta com o valor “2” em todos os jobs, no log do bacula, o backup foi concluido (“Termination: Backup OK”).
    Sabe o que eh esse valor “2”???

  25. Bom dia amigo.
    Estranho demais pois o script em nenhum momento armazena o valor “2” para envio ao Zabbix. Francamente não sei o que está acontecendo.
    Uma coisa que pode ser feita para testes é colocar o valor “Backup OK” no lugar do “OK” que envia o valor “0”. Mas não sei se vai ajudar pois jnão faço ideia de onde vem esse valor 2.
    Abraços

  26. Valeu Pajé.
    Vou colocar isso no script. e qualquer coisa volto a perguntar.

    Em outros cliente que coloquei esse monitoramento esta funcionando que eh uma beleza.

    Gostei muito do seu blog e ja esta nos meus favoritos.

    Abraços

  27. Que bom que ajudei Marcelo.
    Precisando é só perguntar. Abraços e obrigado.

  28. Cara, muito bom esse tutorial. Gpstaria de saber como faço para testar e ver que funciona, pois ele não apresenta nenhum dado aqui no dados recentes do zabbix.


Leave a comment


*

Sem trackbacks