Monitorando servidores com Prometheus e Grafana por Ansible
Lá na Overall.Cloud já temos alguns servidores rodando na AWS e em outros provedores; e neste momento já precisamos ter uma visão de todos ao mesmo tempo, o que está ativo e como estão operando.
Por isso a importância de ter um monitoramento simplificado, uma dashboard clara de todos nossos clientes.
Hoje vou configurar um sistema de monitoramento mais cobiçado da internet, a stack de Prometheus e Grafana, usando "Node Exporter", simplificando com Ansible (automation system). Será que consigo? 😊
Importante: primeiro antes de começar a sair instalando pacotes nos servidores de clientes, vou criar um ambiente de teste, um laboratório com VMWare Workstation Pro. Vou utilizar o Ubuntu Server 20.04 LTS.
Entendendo a lógica:

Basicamente a lógica é, precisamos instalar o Prometheus em um servidor como terminal de monitoração e instalar "exportadores" nos demais servidores.
A gente pode instalar o "Node Exporter". Ele expõe uma ampla variedade de métricas relacionadas a hardware e kernel no Prometheus.
Basicamente é isso! 😂😂
Instalando Ubuntu Server 20.04 LTS
Primeiro passo é instalar o Ubuntu Server na VMWare.

Depois disso, vamos fazer a configuração inicial do servidor.
Criei um usuário chamado "usuario" e o hostname de "monitoramento".
Para evitar ter que sair do nosso usuário normal e fazer login com a conta root, vou configurar o que é conhecido como superusuário, ou privilégios root para nossa conta normal. Isso permitirá que nosso usuário normal execute comandos com privilégios administrativos, ao colocar a palavra sudo
antes de cada comando.
Para adicionar esses privilégios ao nosso novo usuário, precisamos adicionar o usuário ao grupo sudo. Por padrão, no Ubuntu 20.04, os usuários que são membros do grupo sudo têm permissão para utilizar o comando sudo
.
sudo usermod -aG sudo usuario
sudo apt-get update
Vamos precisar criar também chave de acesso SSH.
ssh [email protected]_da_vmware
Basicamente isso, acredito que Firewall neste momento não precisamos configurar.
Instalando Prometheus com Ansible
Para a instalação do Prometheus podemos acompanhar o tutorial no site oficial.
Este é o repositório oficial do Prometheus para Ansible.
Importante: algumas observações do repo.
- Ao atualizar da versão <= 2.4.0 desta função para >= 2.4.1, desative sua instância do Prometheus.
- Ansible >= 2.7 (Pode funcionar em versões anteriores, mas não podemos garantir)
- jmespath on deployer machine
- gnu-tar on Mac deployer host
Todas as variáveis que podem ser substituídas são armazenadas no arquivo defaults/main.yml.
Instalando Ansible
Para instalar o Ansible, segue o comando:
sudo apt update
sudo apt install ansible -y
Como por padrão aqui o Git já vem instalado, posso pular a etapa de instalação do Git no Ubuntu.
Vamos clonar o repositório do Prometheus.
git clone https://github.com/gustavokennedy/monitoramento-prometheus-grafana-ansible.git
Agora, os passos são:
1) Atualizar os endereços das instâncias no arquivo de inventário (invetory).
2) Rodar o Ansible para configurar o Promethes, Node_Exporter, Alertmanager e Grafana.
O comando é:
ansible-playbook playbook.yml
Ao executar, tive um erro de falha ao conectar o SSH.
Tive que fazer os seguintes passos para resolver:
Primeiro dentro do invetory tive que acrescentar a senha e usuário, ficando assim:
[prometheus]
192.168.0.132 ansible_ssh_pass=root ansible_ssh_user=usuario
[node_exporter]
192.168.0.132 ansible_ssh_pass=root ansible_ssh_user=usuario
[alertmanager]
192.168.0.132 ansible_ssh_pass=root ansible_ssh_user=usuario
[grafana]
192.168.0.132 ansible_ssh_pass=root ansible_ssh_user=usuario
Depois instalei o sshpass:
sudo apt-get install sshpass
Depois executei novamente, mas deu erro de também, erro de senha sudo. Então adicionei o -kK:
-k, --ask-pass: pede senha de conexão.
-K, --ask-become-pass: pede senha de escalonamento de privilégio.
ansible-playbook playbook.yml -kK
Agora tive erro de package na instalação do Grafana.
TASK [grafana : Install grafana] *******************************************************************************************************************************************************************************
fatal: [192.168.0.132]: FAILED! => {"ansible_facts": {"pkg_mgr": "apt"}, "changed": false, "msg": "No package matching 'https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.4.3-1.x86_64.rpm' is available"}
Estranho, que ao acessa, eu consigo resposta: https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-5.4.3-1.x86_64.rpm.
Apesar do erro, que não instalou o Grafana, o Prometheus e Node_Exporter estão OK!
Vamso vamos corrigi-lo. Por algum motivo o erro é na instalação do Grafana, por isso vou alterar a estrutura de instalação pelo Ansible.
Vou alterar o arquivo /roles/grafana/tasks/main.yml:
- name: Instalando pacotes APT necessários
apt:
name: apt-transport-https
state: present
update_cache: yes
- name: Adicionando chave GPG e APT do Grafana ao repositório
shell: |
curl https://packages.grafana.com/gpg.key | sudo apt-key add -
add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
args:
warn: no
- name: Adicionando repo do Grafana
apt_repository:
repo: deb https://packages.grafana.com/oss/deb stable main
state: present
filename: grafana
- name: Instalando o Grafana
apt:
name: grafana
state: present
update_cache: yes
- name: Ativando e iniciando serviço do Grafana
service:
name: grafana-server
enabled: yes
state: started
- name: "Copiando arquivos de configuração do Grafana"
template:
src: "grafana.conf.j2"
dest: /etc/grafana/grafana.ini
notify: event_restart_grafana
- name: "Verificando status 200 do Grafana"
uri:
url: http://127.0.0.1:3000
method: GET
status_code: 200
Agora é para funcionar.😊
Se você acessar o meu repositório no Github e rodar o seguinte comando é para funcionar, lembando que precisar alterar os hosts no arquivo inventory:
git clone https://github.com/gustavokennedy/monitoramento-prometheus-grafana-ansible.git
cd monitoramento-prometheus-grafana-ansible
ansible-playbook playbook.yml -kK
https://github.com/gustavokennedy/monitoramento-prometheus-grafana-ansible
Se acessarmos as portas :3000 do Grafana, :9090 do Prometheus e :9100 do Node_Exporter, vamos ter algo.
Então basicamente a instalação via Ansible funcionou. WOW!
Refinando com Nginx
Aproveitar, vamos refinar e deixar mais prático esses acessos.
Por óbvio claro que vamos precisar ter o Nginx instalado. Então já vou aproveitar e configurar os hosts, pra facilitar o acesso das ferramentas.
Vou tentar adicionar o Proxy para o Grafana, que ao acessar /grafana conseguimos acessar localhost:3000.
A documentação está aqui: Run Grafana behind a reverse Proxy.
Você não viu, mas eu criei uma nova role chamado nginx com a task e um file com uma página de index.
Na task já configurei um proxy do Nginx para apontar para:
- Porta 9090 para /prometheus
- Porta 3000 para /grafana
- Porta 9100 para /ne (de node exporter)

Testei aqui e funcionou, claro que depois que corrigi um milhão de erros de permissão e sintaxe. 😂
Agora que temos o ambiente do servidor automatizado com Ansible, vou precisar criar os Agents, onde a gente instala somente o Node Exporter no servidor para configurar no Prometheus as métricas.
Você já percebeu que no localhost/ne a gente já consegue ver ele funcionando. Claro que tive que fazer alguns ajustes.
Para o Grafana rodar:
No arquivo /etc/grafana/grafana.ini:
- Alterar root_url para localhost/grafana/
- Adicionar serve_from_sub_path = true
- Reiniciar Grafana e Nginx
Para o Prometheus rodar no subpath tive que adicionar:
--web.external-url=/prometheus/
Fucei vários repositórios e não encontrei nada sobre essa linha no Ansible. Tentei com Args e Command, criei novos arquivos e nada funcionou. Então eu mesmo criei uma solução:
Criei um arquivo de config templates/default-prometheus.j2 e arquivo de default em roles/prometheus/defaults/main.yml.
defaults/main.yml:
---
prometheus_args: ""
prometheus_metrics_path: /metrics
prometheus_rules: null
prometheus_alert_relabel_configs: []
prometheus_alertmanagers:
- static_configs:
- targets:
- 'localhost:9093'
templates/default-prometheus.j2:
# Vamos setar os argunmentos para o servidor
ARGS="{{ prometheus_args }}"
--web.external-url=/prometheus/
E na task do Prometheus adicionei:
- name: Configurando argumentos no Prometheus
template:
src: default-prometheus.j2
dest: /etc/default/prometheus
notify:
- Reiniciando o Prometheus
tags:
- prometheus
- config
Aproveitando, para evitarmos de toda vez digita o "-kK" na execução do Playbook, fiz aqui a explicação da correção do missing sudo password.
Criando agents para monitoramento do Prometheus
Agora vamos criar um padrão para executar o Node Exporter nos servidores dos clientes, aqui precisa ser algo testado, para gente evitar erros em produção.
Para agilizar aqui, criei m playbook chamado playbook-cliente.yml assim:
---
- hosts: nginx
gather_facts: yes
become_user: root
become_method: sudo
roles:
- nginx
- hosts: node_exporter
become: yes
become_user: root
become_method: sudo
roles:
- prometheus_node_exporter
Esse playbook vai criar o Node Exporter, onde vou executar nos servidores dos clientes e configurar a endpoint no servidor de monitoramento.
Nos próximos posts ensino a configurar e criar os primeiros dashboards. 😊