Para qualquer administrador de sistemas, é fulcral ter controlo sobre a sua infraestrutura. Depois do nosso primeiro tutorial sobre como instalar e configurar o Nagios, achamos que seria importante mostrar como tornar esta ferramenta ainda mais útil. Para tal, vamos configurar o nagios e incluir gráficos de performance, algo que pode ser muito útil na análise de um problema.
NOTA: Estes passos vão ser executados assumindo que está a ser instalado na mesma máquina que o Nagios e que a configuração é igual à disponibilizada no tutorial anterior.
Quando os testes são executados pelo Nagios, uma das respostas fornecidas pela ferramenta são dados de performance. O Nagios na versão OpenSource não possui um motor de análise destes dados, no entanto permite passar essa informação para uma ferramenta de análise externa — é isso que hoje vamos analisar neste artigo. Para tal, vamos usar quatro ferramentas:
- InfluxDB – Base de dados de séries temporais que irá guardar os dados;
- Nagflux – Conector que faz a ligação entre o Nagios e o InfluxDB;
- Grafana – Plataforma web de análise que permite visualizar os dados contidos no InfluxDB; e
- Histou – AddOn do Grafana que permite criar gráficos automaticamente a partir do Nagios.
Instalação das ferramentas
InfluxDB
Vamos começar por instalar o InfluxDB. Para tal, precisamos adicionar o repositório à lista da máquina e podemos fazê-lo da seguinte forma:
cat <<EOF | sudo tee /etc/yum.repos.d/influxdb.repo [influxdb] name = InfluxDB Repository - RHEL \$releasever baseurl = https://repos.influxdata.com/rhel/\$releasever/\$basearch/stable enabled = 1 gpgcheck = 1 gpgkey = https://repos.influxdata.com/influxdb.key EOF
Em seguida, é necessário colocar o serviço no arranque do sistema operativo:
yum install influxdb systemctl start influxdb systemctl enable influxdb
Nagflux
Para a instalação do Nagflux é necessário instalar a linguagem de programação Go e o Git (caso ainda não esteja instalado no sistema):
yum install golang git
De seguida, deve ser descarregado e compilado o Nagflux e definir as permissões nas pastas corretas para interação com o Nagios:
export GOPATH=$HOME/gorepo mkdir $GOPATH go get -v -u github.com/griesbacher/nagflux go build github.com/griesbacher/nagflux mkdir -p /opt/nagflux cp $GOPATH/bin/nagflux /opt/nagflux/ mkdir -p /usr/local/nagios/var/spool/nagfluxperfdata chown nagios:nagios /usr/local/nagios/var/spool/nagfluxperfdata
Por fim, podemos criar um serviço para nos ser mais fácil controlar o Nagflux, e colocá-lo no arranque do sistema:
cp $GOPATH/src/github.com/griesbacher/nagflux/nagflux.service /usr/lib/systemd/system/ chmod +x /usr/lib/systemd/system/nagflux.service systemctl daemon-reload systemctl enable nagflux.service
Grafana
O Próximo passo é a instalação da plataforma de visualização de gráficos. Para fazer a instalação vamos criar um novo repositório na máquina:
nano /etc/yum.repos.d/grafana.repo [grafana] name=grafana baseurl=https://packagecloud.io/grafana/stable/el/7/$basearch repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://packagecloud.io/gpg.key https://grafanarel.s3.amazonaws.com/RPM-GPG-KEY-grafana sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt
É necessário abrir o porto de serviço na firewall:
firewall-cmd --add-port=3000/tcp --permanent firewall-cmd --reload
Instalar o grafana:
yum install grafana
E por fim, colocar o serviço a funcionar:
systemctl daemon-reload systemctl start grafana-server systemctl enable grafana-server
Histou
Nesta altura falta apenas instalar o Histou. Para tal, podemos correr os seguintes comandos:
cd /tmp wget -O histou.tar.gz https://github.com/Griesbacher/histou/archive/v0.4.3.tar.gz mkdir -p /var/www/html/histou cd /var/www/html/histou tar xzf /tmp/histou.tar.gz --strip-components 1 cp histou.ini.example histou.ini cp histou.js /usr/share/grafana/public/dashboards/
Configuração dos serviços e do Nagios
Agora que temos tudo o que é necessário instalado, falta-nos configurar as ferramentas e o Nagios.
Nagflux
Vamos começar por configurar o Nagflux, para tal vamos criar o ficheiro “/opt/nagflux/config.gcfg” e introduzir o seguinte dentro dele:
nano /opt/nagflux/config.gcfg
nano /opt/nagflux/config.gcfg [main] NagiosSpoolfileFolder = "/usr/local/nagios/var/spool/nagfluxperfdata" NagiosSpoolfileWorker = 1 InfluxWorker = 2 MaxInfluxWorker = 5 DumpFile = "nagflux.dump" NagfluxSpoolfileFolder = "/usr/local/nagios/var/nagflux" FieldSeparator = "&" BufferSize = 10000 FileBufferSize = 65536 DefaultTarget = "all" [Log] LogFile = "" MinSeverity = "INFO" [InfluxDBGlobal] CreateDatabaseIfNotExists = true NastyString = "" NastyStringToReplace = "" HostcheckAlias = "hostcheck" [InfluxDB "nagflux"] Enabled = true Version = 1.0 Address = "http://127.0.0.1:8086" Arguments = "precision=ms&u=root&p=root&db=nagflux" StopPullingDataIfDown = true [InfluxDB "fast"] Enabled = false Version = 1.0 Address = "http://127.0.0.1:8086" Arguments = "precision=ms&u=root&p=root&db=fast" StopPullingDataIfDown = false
Precisamos reiniciar o serviço:
systemctl restart nagflux.service
Para verificarmos se está tudo correto até este passo podemos executar o comando:
curl -G "http://localhost:8086/query?pretty=true" --data-urlencode "q=show databases"
O comando deve devolver um resultado semelhante a:
{ "results": [ { "statement_id": 0, "series": [ { "name": "databases", "columns": [ "name" ], "values": [ [ "_internal" ], [ "nagflux" ] ] } ] } ] }
Devemos ter em especial atenção se aparece a string “nagflux”. Em caso afirmativo, podemos avançar.
Nagios
SELinux
Antes de começar com a configuração do Nagios propriamente dita, gostaria de referir que muito provavelmente o SELinux vai impedir que esta configuração funcione. Para resolver este problema, há 2 soluções:
- Desativar o SELinux. Pessoalmente, desaconselho fortemente pois o SELinux é um excelente mecanismo de segurança.
- Ajustar o SELinux, de forma a permitir a execução dos nossos serviços. No entanto esta configuração é complexa e depende de vários factores, motivo pelo qual não é possível deixar aqui os comandos executados para habilitar o SELinux. Posso no entanto recomendar que sigam o nosso tutorial sobre SELinux de forma a resolveram o problema.
Faço uma nota importante que não basta auditar o SELinux uma vez, pois à medida que vão desbloqueando alguns parâmetros podem aparecer outros a ser bloqueados, no meu caso tive de executar 3 operações (com várias regras cada) até ter tudo funcional.
Começando agora com a configuração do Nagios propriamente dita, temos de editar o ficheiro de configuração, no nosso caso, disponível em “/etc/nagios/nagios.cfg” e editar as seguintes linhas:
process_performance_data=1 host_perfdata_file=/usr/local/nagios/var/host-perfdata host_perfdata_file_template=DATATYPE::HOSTPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tHOSTPERFDATA::$HOSTPERFDATA$\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$ host_perfdata_file_mode=a host_perfdata_file_processing_interval=15 host_perfdata_file_processing_command=process-host-perfdata-file-nagflux service_perfdata_file=/usr/local/nagios/var/service-perfdata service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\tTIMET::$TIMET$\tHOSTNAME::$HOSTNAME$\tSERVICEDESC::$SERVICEDESC$\tSERVICEPERFDATA::$SERVICEPERFDATA$\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$ service_perfdata_file_mode=a service_perfdata_file_processing_interval=15 service_perfdata_file_processing_command=process-service-perfdata-file-nagflux
Estas linhas já se encontram no ficheiro, algumas comentadas, outras com valores diferentes dos necessários, como elas estão espalhadas e não seguidas de forma a facilitar a edição para quem tem uma configuração igual à nossa, podem usar os seguintes comandos:
sed -i 's/^process_performance_data=0/process_performance_data=1/g' /etc/nagios/nagios.cfg sed -i 's/^#host_perfdata_file=/host_perfdata_file=/g' /etc/nagios/nagios.cfg sed -i 's/^#host_perfdata_file_template=.*/host_perfdata_file_template=DATATYPE::HOSTPERFDATA\\tTIMET::$TIMET$\\tHOSTNAME::$HOSTNAME$\\tHOSTPERFDATA::$HOSTPERFDATA$\\tHOSTCHECKCOMMAND::$HOSTCHECKCOMMAND$/g' /etc/nagios/nagios.cfg sed -i 's/^#host_perfdata_file_mode=/host_perfdata_file_mode=/g' /etc/nagios/nagios.cfg sed -i 's/^#host_perfdata_file_processing_interval=.*/host_perfdata_file_processing_interval=15/g' /etc/nagios/nagios.cfg sed -i 's/^#host_perfdata_file_processing_command=.*/host_perfdata_file_processing_command=process-host-perfdata-file-nagflux/g' /etc/nagios/nagios.cfg sed -i 's/^#service_perfdata_file=/service_perfdata_file=/g' /etc/nagios/nagios.cfg sed -i 's/^#service_perfdata_file_template=.*/service_perfdata_file_template=DATATYPE::SERVICEPERFDATA\\tTIMET::$TIMET$\\tHOSTNAME::$HOSTNAME$\\tSERVICEDESC::$SERVICEDESC$\\tSERVICEPERFDATA::$SERVICEPERFDATA$\\tSERVICECHECKCOMMAND::$SERVICECHECKCOMMAND$/g' /etc/nagios/nagios.cfg sed -i 's/^#service_perfdata_file_mode=/service_perfdata_file_mode=/g' /etc/nagios/nagios.cfg sed -i 's/^#service_perfdata_file_processing_interval=.*/service_perfdata_file_processing_interval=15/g' /etc/nagios/nagios.cfg sed -i 's/^#service_perfdata_file_processing_command=.*/service_perfdata_file_processing_command=process-service-perfdata-file-nagflux/g' /etc/nagios/nagios.cfg
Vamos necessitar ainda de editar o ficheiro “/etc/nagios/objects/commands.cfg” e acrescentar no fundo os seguintes parâmetros:
nano /etc/nagios/objects/commands.cfg define command { command_name process-host-perfdata-file-nagflux command_line /bin/mv /var/log/nagios/host-perfdata /usr/local/nagios/var/spool/nagfluxperfdata/$TIMET$.perfdata.host } define command { command_name process-service-perfdata-file-nagflux command_line /bin/mv /var/log/nagios/service-perfdata /usr/local/nagios/var/spool/nagfluxperfdata/$TIMET$.perfdata.service }
Podemos agora verificar se a configuração do Nagios está correcta com o comando:
nagios -v /etc/nagios/nagios.cfg
Em caso afirmativo podemos reiniciar o serviço:
systemctl restart nagios.service
E podemos agora verificar se a integração com o Nagflux está a funcionar, executando o seguinte comando:
curl -G "http://localhost:8086/query?db=nagflux&pretty=true" --data-urlencode "q=show series"
Que nos deve apresentar um resultado semelhante a:
Se obtivermos resultados começados por “metrics” está tudo ok!
Grafana
Precisamos agora de indicar ao Grafana onde recolher os dados. Para tal devemos ir ao browser e abrir a pagina “http://ip_maquina:3000” e chegamos à página de Login:
Por defeito o user e a password são “admin” que nos será pedido para mudar assim que fazemos login pela primeira vez.
Devemos em seguida clicar em “Add Source”:
E introduzir os valores:
Name: nagflux
Type: InfluxDB
URL: http://localhost:8086
Access: Server(Default)
Database: nagflux
E em seguida clicar em “Save & Test” o que nos deve devolver “Data source is working”, como representado na imagem seguinte. Todos os outros campos devem ser deixados iguais.
Histou
Configurando agora o Histou, precisamos de editar o ficheiro “/usr/share/grafana/public/dashboards/histou.js”, e mudar a seguinte linha:
nano /usr/share/grafana/public/dashboards/histou.js var url = 'http://localhost/histou/';
Alterar “localhost” para o IP da máquina. Para verificar que está a funcionar podemos executar o seguinte comando, que nos deve devolver uma grande quantidade de dados:
curl -G "http://localhost/histou/?host=localhost&service=PING"
Em caso afirmativo podemos já visualizar no browser informação colocando no endereço algo como:
“http://ip_da_maquina:3000/dashboard/script/histou.js?host=localhost&service=PING” no meu caso o IP é “192.168.2.163”:
E já podemos observar dados provenientes do nagios.
Integração com a interface do Nagios
Neste momento falta apenas integrarmos este gráficos de forma simples na interface gráfica do Nagios de forma a tirarmos o melhor partido deles.
Se bem se lembram a interface do Nagios é algo como:
Para integrar esta interface com o grafana, precisamos apenas de efectuar mais alguns passos. Primeiro vamos editar o ficheiro “/etc/nagios/objects/templates.cfg” e adicionar os seguintes blocos:
nano /etc/nagios/objects/templates.cfg define host { name host-grafana action_url http://192.168.2.163:3000/dashboard/script/histou.js?host=$HOSTNAME$ register 0 } define service { name service-grafana action_url http://192.168.2.163:3000/dashboard/script/histou.js?host=$HOSTNAME$&service=$SERVICEDESC$ register 0 }
E agora precisamos apenas de indicar para cada um dos nossos “clientes” que estão a ser monitorizados esta indicação. Para tal devemos ir aos ficheiros de configuração dos clientes “/etc/nagios/servers/*.cfg” e editar da seguinte forma:
define host { use linux-server,host-grafana . . define service { use generic-service,service-grafana
NOTA: o ficheiro não tem esta aparência, eu apenas estou a dar o exemplo das linhas que devem ser alteradas;
Devem ter em conta que no bloco “host” que está logo no início do ficheiro têm de adicionar “host-grafana” e nos blocos dos serviços “service-grafana”, e tem de ser adicionado em cada um dos serviços.
Para finalizar devem editar da mesma forma o ficheiro de configuração do localhost, de forma a também terem essa integração para a própria máquina, o ficheiro a editar é “/etc/nagios/objects/localhost.cfg”.
Devemos verificar se está tudo ok com as novas configurações:
nagios -v /etc/nagios/nagios.cfg
Podemos então agora fazer restart ao Nagios (ou mesmo reboot à máquina depois de tanta alteração).
systemctl restart nagios.service
Agora se nos dirigirmos ao nosso Nagios vamos encontrar uma pequena diferença:
Como podem ver obtemos um pequeno icon em cada serviço, e no próprio cliente. Clicando isto leva-nos directamente ao grafana com um gráfico para esse serviço/máquina, por exemplo ver a load de CPU do localhost:
Já podemos observar o gráfico do lado direito a aparecer, e ao fim de algum tempo de recolha podemos então ver coisas mais interessantes de analisar:
Espero que achem útil esta integração, no meu dia a dia é uma ferramenta bastante útil para tentar diagnosticar alguns problemas, de forma mais rápida e simples. Deixem os vossos comentários, sugestões e dúvidas.