6 min read

Monitorando servidores com Prometheus e Grafana por Ansible

Monitorando servidores com Prometheus e Grafana por Ansible
Photo by Luke Chesser / Unsplash

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. 😊