Cómo instalar Elasticsearch, Logstash y Kibana (Elastic Stack) en Ubuntu 20.04

by Mayra Salas

Descubre cómo instalar Elasticsearch, Logstash y Kibana (Elastic Stack) en Ubuntu 22.04 con un script Bash. Este script te guiará a través del proceso de instalación y configuración de cada componente, facilitando la implementación de una poderosa solución de gestión de registros y análisis de datos.

Requisitos previos

Para completar este tutorial, necesitará lo siguiente:

Requerimientos de sistema

  • Memoria : 2GB o más
  • Cpu: 4 Cores a más
  • Disco duro : Más de 50GB de espacio disponible en disco duro
  • Sistema : (Ubuntu20, Debian10), garantizar que sea un sistema operativo limpio

Contenido: En este tutorial, aprenderás a utilizar un script Bash para realizar la configuración automatizada de ELK Stack en tu servidor. El script aborda los siguientes pasos:

  1. Actualización y mejora del sistema operativo.
  2. Verificación e instalación de herramientas esenciales, como Nginx, Java y Whiptail.
  3. Configuración de Elasticsearch con ajustes personalizados, incluyendo la modificación de la dirección IP.
  4. Instalación y configuración de Kibana, con la opción de establecer contraseñas de usuario.
  5. Configuración de Nginx como un servidor proxy para Kibana, permitiendo el acceso desde un dominio personalizado o localhost.
  6. Instalación y configuración de Logstash, con la creación de archivos de entrada y salida para Elasticsearch.
  7. Configuración de Filebeat para enviar datos a Logstash o Elasticsearch, según las preferencias.

Este script interactivo guía al usuario a través de cada paso, proporcionando mensajes de progreso y pausas para revisar la información crítica. Al finalizar, tendrás un entorno ELK Stack completamente funcional y listo para la visualización y análisis avanzado de datos y registros.

#!/bin/bash

# Función para verificar la instalación de un paquete
check_installation() {
    if [ $? -eq 0 ]; then
        echo "$1 instalado correctamente."
    else
        echo "Error al instalar $1. Saliendo."
        exit 1
    fi
}

# Mensaje de inicio
echo "Iniciando la configuración del sistema..."

# Actualizar y mejorar el sistema
echo "Ejecutando apt update y apt upgrade..."
sudo apt update
sudo apt upgrade -y

# Verificar si whiptail está instalado
echo "Verificando si whiptail está instalado..."
if ! [ -x "$(command -v whiptail)" ]; then
    echo 'whiptail no está instalado. Instalando...'
    sudo apt-get install whiptail -y
    check_installation "whiptail"
else
    echo "whiptail ya está instalado."
fi

# Verificar si Nginx está instalado
echo "Verificando si Nginx está instalado..."
if ! [ -x "$(command -v nginx)" ]; then
    echo 'nginx no está instalado. Instalando...'
    apt-get install nginx -y
    check_installation "Nginx"
else
    echo "Nginx ya está instalado."
fi

# Verificar si Java está instalado
echo "Verificando si Java está instalado..."
if ! [ -x "$(command -v java)" ]; then
    echo 'Java no está instalado. Instalando...'
    apt-get install default-jre -y
    check_installation "Java"
else
    echo "Java ya está instalado."
fi

# Configurar Elasticsearch
echo "Configurando Elasticsearch..."
curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch |sudo gpg --dearmor -o /usr/share/keyrings/elastic.gpg
echo "deb [signed-by=/usr/share/keyrings/elastic.gpg] https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
sudo apt update
sudo apt install elasticsearch

sudo systemctl start elasticsearch
sudo systemctl enable elasticsearch

# Configurar Kibana
echo "Configurando Kibana..."
sudo apt install kibana
sudo systemctl enable kibana
sudo systemctl start kibana

# Obtener la contraseña del usuario para Elasticsearch

echo "network.host: "0.0.0.0"" | sudo tee -a /etc/elasticsearch/elasticsearch.yml
echo "cluster.name: demo-elk" | sudo tee -a /etc/elasticsearch/elasticsearch.yml
echo "node.name: elk-1" | sudo tee -a /etc/elasticsearch/elasticsearch.yml
echo "discovery.type: single-node" | sudo tee -a /etc/elasticsearch/elasticsearch.yml

# Configurar Nginx
echo "Configurando Nginx..."
domain_option=$(whiptail --title "Configuración de nginx" --menu "Seleccione una opción:" 15 60 4 \
    "1" "Dominio personalizado" \
    "2" "Localhost" \
    3>&1 1>&2 2>&3)

case $domain_option in
    1)
        domain=$(whiptail --inputbox "Ingrese el dominio personalizado:" 10 60 3>&1 1>&2 2>&3)
        domain_option2=$domain
        ;;
    2)
        # Obtener automáticamente la dirección IP local
        domain_option2="kibana"
        domain=$(hostname -I | awk '{print $1}')
        ;;
    *)
        echo "Opción no válida. Saliendo."
        exit 1
        ;;
esac

config_file="/etc/nginx/sites-available/$domain_option2"

cat > "$config_file" << EOL
server { 
    listen 80;

    server_name $domain;

    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade "\$http_upgrade";
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host "\$host";
        proxy_cache_bypass "\$http_upgrade";
    }
}
EOL


# Configurar Kibana
echo "Configurando Kibana..."
sudo bash -c 'cat >> /etc/kibana/kibana.yml' <<EOL
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://localhost:9200"]

EOL

service elasticsearch restart
service kibana restart

# Pausa para revisar mensajes
read -p "Presiona Enter para continuar..."

# Crear enlace simbólico solo si el archivo de configuración se ha creado con éxito
if [ -e "$config_file" ]; then
    sudo ln -s "$config_file" "/etc/nginx/sites-enabled/$domain_option2"
    # Verificar la configuración de Nginx antes de recargar
    sudo nginx -t && sudo systemctl reload nginx
else
    echo "Error al crear el archivo de configuración. Saliendo."
    exit 1
fi

echo "Configuración de Nginx completa."

# Pausa para revisar mensajes
read -p "Presiona Enter para continuar..."

# Configurar Logstash
echo "Configurando Logstash..."
sudo apt install logstash

# Crear archivo de entrada para beats
cat > /etc/logstash/conf.d/02-beats-input.conf << EOL
input {
  beats {
    port => 5044
  }
}
EOL

# Crear archivo de salida para Elasticsearch
cat > /etc/logstash/conf.d/30-elasticsearch-output.conf << EOL
output {
  if [@metadata][pipeline] {
	elasticsearch {
  	hosts => ["localhost:9200"]
  	manage_template => false
  	index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  	pipeline => "%{[@metadata][pipeline]}"
	}
  } else {
	elasticsearch {
  	hosts => ["localhost:9200"]
  	manage_template => false
  	index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
	}
  }
}
EOL

# Verificar la configuración de Logstash antes de reiniciar
sudo -u logstash /usr/share/logstash/bin/logstash --path.settings /etc/logstash -t

# Reiniciar Logstash
sudo systemctl restart logstash
sudo systemctl start logstash
sudo systemctl enable logstash

# Pausa para revisar mensajes
read -p "Presiona Enter para continuar..."

# Configurar Filebeat
echo "Configurando Filebeat..."
sudo apt install filebeat

filebeat_conf="/etc/filebeat/filebeat.yml"

# Descomentar las líneas de output.logstash y hosts
sed -i '/^#output\.elasticsearch:/,/^#hosts: \["localhost:9200"\]/ { s/^#output\.elasticsearch:/output.logstash:/; s/^  #hosts: \["localhost:9200"\]/  hosts: \["localhost:5044"\]/ }' "$filebeat_conf"
sudo filebeat modules enable system
sudo filebeat setup --pipelines --modules system

sudo filebeat setup --index-management -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=[http://localhost:9200]'
sudo filebeat setup -E output.logstash.enabled=false -E output.elasticsearch.hosts=['localhost:9200'] -E setup.kibana.host=localhost:5601
sudo systemctl start filebeat
sudo systemctl enable filebeat


echo "Configuración completa. Puedes acceder a Kibana en http://$domain_option/ o http://$domain/"

¡Transforma la gestión de registros y obtén insights significativos con ELK Stack de manera rápida y eficiente gracias a este script Bash!

Habilitando interfaz de login

se deseamos activar la interfaz de logueo, debemos reaalizar los siguiente pasos:

Activamos el xpack correspondiente al servicio de elasticsearch y reinciamos.

echo "xpack.security.enabled: true" | sudo tee -a /etc/elasticsearch/elasticsearch.yml
service elasticsearch restart

Luego establecemos las credenciales de acceso ejecutando el siguiente comando :

sudo /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto

Luego debemos editar el fichero kibana.yml nano /etc/kibana/kibana.yml e ingresamos la clave generada :

xpack.security.enabled: true
elasticsearch.username: "kibana"
elasticsearch.password: "kibana_password"

y hacemos lo mismo con el archivo filebeat nano /etc/filebeat/filebeat.yml


  username: "elastic"
  password: elastic_password

luego reiniciamos ambos servicios

service elasticsearch restart
service kibana restart
ingresamos nuevamente al sitio web y ahora ingresamos la clave del usuario elastic

Related Posts

1 comment

Cristobal Nunez 27 mayo, 2024 - 5:59 pm

Me has dejado helado… Solo te falto agregar el certificado de letsencrypt y ya dejabas el servidor montado, esta es la quinta vez que monto un servidor elk pero nunca me habia resultado tan facil.

Reply

Leave a Comment