4.8 Verificação de Contêineres via NRPE
Conforme comentado anteriormente, a verificação de informações em hosts executando remotamente ou em rede dependem de serviços executando fora do contêiner do Nagios, o que também exige uma forma de comunicação entre o Nagios e a máquina que viabiliza a execução dos demais elementos. No nosso caso, estamos interessados em nos comunicar com a máquina em que os contêineres Docker estão em execução. No exemplo explorado até o momento, todos os contêineres estão executando sobre a mesma máquina física, mas, em geral, na prática, podemos ter contêineres executando em diferentes hosts, gerenciados por diferentes Docker daemons.
Nesta seção, usaremos um recurso, denominado checagem ativa por NRPE (Nagios Remote Plugin Execution) para viabilizar a execução de comandos que verifiquem dados sobre os contêineres em execução por meio do Nagios. Para isso, teremos que 1) instalar o servidor NRPE no host que hospeda o Docker daemon e executa os contêineres; 2) criar comandos que façam as verificações que desejamos nos contêineres; e 3) integrar os novos verificadores ao servidor NRPE de modo que o servidor Nagios possa apresentar os dados na sua interface.
A figura a seguir ilustra a configuração que definimos para viabilizar que o servidor Nagios possa coletar dados sobre elementos (contêineres) remotos.

4.8.1 Instalação do servidor NRPE na máquina hospedeira
Para que o servidor Nagios (nagios-server) possa monitorar recursos existentes numa máquina remota, ou que dependam de comandos que só podem ser executados na máquina que gerencia determinados recursos, é necessário que o servidor Nagios deve se comunicar com essa máquina remota. No nosso exemplo, vamos considerar que a máquina hospedeira que gerencia e controla a execução dos contêineres seja essa máquina. Desse modo, a instalação do servidor de NRPE (nrpe-server) na mesma se faz necessário.
Considerando que se trata de uma máquina com SO Linux baseada em Ubuntu/Debian, o processo de instalação desse servidor pode ser feito conforme apresentado nos passos a seguir.
Instalação do servidor via repositórios
Ao término deste processo, o servidor NRPE e o conjunto de plugins com comandos que podem ser executados na máquina hospedeira estarão instalados, restando apenas configurar o servidor NRPE.
O arquivo de configuração do NRPE estará localizado em /etc/nagios/nrpe.cfg. Ao editar este arquivo devem ser alteradas as configurações padrão conforme abaixo:
Basta procurar cada um desses elementos no arquivo e substituir com as informações pertinentes. O primeiro (allowed_hosts) determina quais hosts remotos podem se conectar com o NRPE server. No nosso caso, queremos que o nagios-server se comunique com esse servidor e, desse modo, o IP do nagios-server atribuído na minharede é utilizado aqui. Para descobrir o UP, basta utilizar o comando docker network inspect minharede e verificar o IP atribuído ao nagios-server.
O segundo (dont_blame_nrpe) indica que os NRPE server podem receber e tratar argumentos vindos do servidor Nagios.
O terceiro (allow_bash_command_substitution) indica que os scripts de verificação podem realizar substituição de comandos bash, bastante utilizados em scripts Bash. Demonstraremos isso quando formos implementar os comandos de verificação de uso de CPU e memória pelos contêineres.
Mais informações sobre essas opções podem ser consultadas nos comentários do próprio arquivo /etc/nagios/nrpe.cfg e na documentação do próprio Nagios.
Configuração do Firewall para acesso ao servidor NRPE
O serviço oferecido pelo NRPE é disponibilizado na porta 5666 conforme indicado na configuração do arquivo /etc/nagios/nrpe.cfg. Para isso, precisamos abrir essa porta para viabilizar conexões externas à mesma.
Para isso, considerando uma máquina com SO Linux Mint ou outras distribuições baseadas em Debian, executamos os comandos abaixo:
Atualizar o arquivo
/etc/services
O arquivo /etc/services é utilizado para traduzir o nome de uma aplicação para um número de porta para conexão via rede. Nesse caso, estamos traduzindo nrpe para a porta 5666 via conexão TCP.
Configurar Firewall
Feita essa alteração, podemos iniciar o servidor NRPE e testar o seu funcionamento. Para iniciar, consultar o status de execução, ou reiniciar o servidor em caso de alterações no arquivo /etc/nagios/nrpe.cfg, basta executar um dos comandos abaixo, respectivamente:
Para verificar o status do serviço em execução, utilizamos o mesmo comando, mas com a palavra status no final, no lugar de start. Se tudo correr bem, o resultado deve ser algo semelhante ao exibido abaixo:
Teste do servidor em execução na máquina local
Para verificar se o servidor está respondendo corretamente, basta executarmos os comandos abaixo e observar se a saída é conforme apresentado.
Adicionar o usuário nagios ao grupo docker
Ao terminar essa instalação, é criado um usuário nagios no sistema operacional e, para que o mesmo possa executar com sucesso os comandos do Docker sem permissão de superusuário, precisamos que o mesmo seja adicionado ao grupo docker e, posteriormente, a máquina seja reinicializada antes de continuar com os próximos passos.
4.8.2 Criando os scripts de monitoramento dos contêineres
No site do Nagios existe uma grande variedade de plugings disponíveis para uso na plataforma. Os que aparecem na pasta /usr/lib/nagios/plugins/ acompanham a ferramenta, mas outros podem ser baixados ou até mesmo desenvolvidos, desde que respeitem as regras estabelecidas para tal, disponíveis em https://nagios-plugins.org/doc/guidelines.html.
Basicamente, um plugin executa comandos e expõe os resultados de forma padronizada para que a interface do Nagios server possa apresentá-los adequadamente. O Nagios estabelece que o mesmo deve retornar um código numérico conforme abaixo:
Plugin Return Codes
0
OK
O plugin foi capaz de verificar o serviço e parecia estar funcionando corretamente
1
Warning
O plug-in conseguiu verificar o serviço, mas parecia estar acima de algum limite de "aviso" ou não parecia estar funcionando corretamente
2
Critical
O plug-in detectou que o serviço não estava em execução ou estava acima de algum limite "crítico"
3
Unknown
Argumentos de linha de comando inválidos foram fornecidos ao plug-in ou falhas de baixo nível internas ao plug-in (como incapacidade de abrir um socket tcp) que o impedem de executar a operação especificada. Erros de nível superior (como erros de resolução de nomes, tempos limite de socket, etc.) estão fora do controle de plugins e geralmente NÃO devem ser relatados como estados UNKNOWN.
Saída textual
Já em relação ao formato da saída de texto, a partir do Nagios 3 ela pode ter mais de uma linha de texto, mas nos exemplos abaixo, limitamos a uma linha. Além disso, é recomendado que cada linha não tenha mais de 85 caracteres. O formato da linha é conforme abaixo:
Por exemplo, ao executar o comando de verificação check_users, que permite consultar quantos usuários estão conectados na máquina, a saída é conforme abaixo:
Após implementados, a instalação dos plugins consistem apenas em copiá-los para uma pasta desejada e alterar o arquivo de configuração do NRPE server para que os mesmos possam ser reconhecidos e executados pelo Nagios server via RNPE.
Os que apresentamos a seguir são adaptações de dois dos disponíveis em
O primeiro plugin é uma adaptação do plugin NRPE denominado check_container_cpu.sh, disponível no repositório https://github.com/ninoabbate/nrpe-plugins. O código adaptado é apresentado abaixo:
Basicamente, o plugin é um script bash que executa os comandos docker inspect para descobrir se o contêiner desejado está em execução (linha 44) e o docker stats (linha 63) para detectar o consumo de CPU por parte do contêiner em execução.
O outro plugin, denominado check_container_mem.sh, é uma adaptação do anterior sendo que, ao invés de se consultar o consumo de CPU, consulta o consumo de memória por parte do contêiner em execução. Para isso, faz uso também do docker info. O código completo do plugin é apresentado abaixo:
4.8.3 Instalando os plugins desenvolvidos no NRPE server
Construídos os plugins vamos copiá-los para a pasta de plugins do servidor NRPE, localizado no diretório /usr/lib/nagios/plugins/.
Após copiados, podemos testá-los localmente conforme abaixo:
Para finalizar as configurações do lado do NRPE server é necessário atualizarmos o arquivo /etc/nagios/nrpe.cfg. Nesse arquivo, além das configurações já realizadas, são descritos os serviços que poderão ser executados de forma remota. Precisamos indicar isso no servidor. Desse modo, no final deste mesmo arquivo, vamos incluir os comandos abaixo, referentes aos dois verificadores que estamos interessados.
Observa-se que estamos criando dois comandos, um denominado check_container_cpu e outro check_container_mem . Eles são baseados nos respectivos scripts check_container_cpu.sh e check_container_mem.sh. Apesar desses scripts exigirem mais de um argumento quando invocados via linha de comando, observe que, quando configurados no servidor NRPE, um único argumento é fornecido, ARG1$. Na verdade, posteriormente, esse argumento único é expandido e desmembrado pelo NRPE antes da invocação do script, conforme demonstraremos a seguir.
4.8.4 Configurando o Nagios server para se comunicar via NRPE
Uma vez feita a configuração do servidor NRPE, agora podemos dar início à configuração do lado do servidor Nagios e usar os comandos definidos.
Da mesma forma como apresentado na Seção 4.5, podemos criar arquivos de configuração para implementar o uso dos comandos acima de diferentes maneiras. Uma delas, ainda não explorada, seria criarmos uma definição de host no arquivo hosts.cfg.
Um novo hostgroup específico para o monitoramento de contêineres e, desse modo, usar os comandos acima.
Assim sendo, faremos as seguintes alterações nos arquivos criados anteriormente. O primeiro será o arquivo de hostgroups.cfg. No seu final incluímos a definição de um novo grupo containers.
Em seguida, colocamos cada host desejado associado a esse hostgroup.
Resta agora configurar o arquivo commnds.cfg, criando os comandos desejados usando os recursos do NRPE e, posteriormente, configurarmos o arquivo de services.cfg, fazendo uso dos comandos definidos.
Observa-se nos comandos incluídos acima que foram criados dois novos comandos: check_container_cpu_nrpe e check_container_mem_nrpe. Ambos utilizam o comando check_rnpe do Nagios, indicando que esses comandos serão utilizados para a coleta de dados no host identificado por $ARG1$. Em seguida, o parâmetro -c identifica quais dos comandos definidos no servidor NRPE (arquivo /etc/nagios/nrpe.cfg), ilustrado anteriormente: check_container_cpu e check_container_mem, respectivamente. E o parâmetro -a identifica uma string contendo todos os argumentos necessários para executar os comandos necessários. No exemplo acima, são fornecidas três informações, identificadas por $ARG2$, $ARG3$ e $ARG4$ que indicam, respectivamente, o nome ou ID do contêiner a ser monitorado, o limite superior para que um warning no uso do recurso seja emitido, e o limite superior para que um alerta crítico seja emitido.
Agora esses comandos podem ser empregados na construção de um serviço de monitoramento.
Observa-se acima que construímos dois novos services: container-cpu-usage e container-mem-usage. Ambos pertencem ao hostgroup containers e usam os comandos definidos acima para funcionarem. Na frente dos comandos, as strings deliminadas por ! definem os valores das variáveis $ARG1$, $ARG2$, $ARG3$ e $ARG4$, respectivamente, e são, dessa forma, utilizados na invocação dos comandos. Nos exemplos acima, o primeiro valor corresponde ao IP do servidor NRPE (192.168.18.110) em execução na mesma máquina que o Docker Daemon, o segundo ao nome do contêiner, obtido por meio da macro$HOSTNAME$, disponível nas Macros do Nagios, e os demais valores aos limites utilizados para a emissão de avisos do tipo WARNING e CRITICAL.
Encerradas as configurações, resta apenas construir a imagem do servidor do Nagios e disparar sua execução.
Em seguida, inicializado o servidor do Nagios, resta apenas iniciar os demais contêineres que serão monitorados.


Last updated