ELK - Installation ELK (Elasticsearch Logstash Kibana)
Alasta 8 Septembre 2014 bigdata Apache bash BigData CentOS cli Linux monitoring Open Source
Description : Voici comment installer la suite de logiciel open source Elasticsearch Logstash Kibana qui permet de faire de magnifique dashboard et des recherches dans le "Big-Data". C'est une excellente alternative au produit commercial Splunk ou Loggly (qui est dans le cloud).
Présentation :
Cette suite (il y a aussi d'autres logiciels qui peuvent s'y greffer comme par exemple redis, flume) se décompose comme cela :
- Elasticsearch : l'indexer (Base de données en NoSQL)
- Logstash : Parser qui va permettre d'alimenter Elasticsearch
- Kibana : la WebUI qui permet de générer des dashboards, recherches de donnée sur Elasticsearch
Contexte :
Nous allons installer cette solution à partir d'une CentOS 6.5 avec SELinux en permissif.
Pour l'installation des packages il y a 2 possibilités les RPMs ou les repositories.
Les fondations :
Le pré-requis minimum sont un serveur Web et Java.
Apache
yum install httpd chkconfig --level 2345 httpd on service httpd start
Java
yum install java-1.7.0-openjdk
Elasticsearch :
RPM
cd /usr/src wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.3.2.noarch.rpm yum localinstall elasticsearch-1.3.2.noarch.rpm #préférer yum localinstall à rpm -ivh car il n'y a pas de corruption de la DB yum chkconfig --level 2345 elasticsearch on service elasticsearch start
Repository
rpm --import http://packages.elasticsearch.org/GPG-KEY-elasticsearch
[elasticsearch-1.3] name=Elasticsearch repository for 1.3.x packages baseurl=http://packages.elasticsearch.org/elasticsearch/1.3/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
yum install elasticsearch chkconfig --level 2345 elasticsearch on service elasticsearch start
Test de bon fonctionnement
curl http://127.0.0.1:9200 { "status" : 200, "name" : "John Falsworth", "version" : { "number" : "1.3.2", "build_hash" : "dee175dbe2f254f3f26992f5d7591939aaefd12f", "build_timestamp" : "2014-08-13T14:29:30Z", "build_snapshot" : false, "lucene_version" : "4.9" }, "tagline" : "You Know, for Search" }
Logstash :
RPM
wget https://download.elasticsearch.org/logstash/logstash/packages/centos/logstash-1.4.2-1_2c0f5a1.noarch.rpm wget https://download.elasticsearch.org/logstash/logstash/packages/centos/logstash-contrib-1.4.2-1_efd53ef.noarch.rpm yum localinstall logstash*
Repository
[logstash-1.4] name=logstash repository for 1.4.x packages baseurl=http://packages.elasticsearch.org/logstash/1.4/centos gpgcheck=1 gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch enabled=1
yum -y install logstash*
Configuration de base :
Notre fichier de configuration de base permettra de rediriger les messages syslog dans Elasticsearch.
input { #Ouverture en entrée d'un port d'écoute utilisant le protocol syslog tcp { port => 5544 type => syslog } udp { port => 5544 type => syslog } } filter { # Traitement type syslog, le type étant marqué sur les données entrant par nos ports de type syslog if [type] == "syslog" { grok { # Si on ne veut pas garder le message non traité overwrite => "message" match => { # rsyslong envoi des messages de type : <Numero>Ligne Syslog avec le message "message" => "^(?:<%{NONNEGINT:syslog_pri}>)?%{SYSLOGBASE2} %{GREEDYDATA:message}" "message" => "%{SYSLOG5424PRI}%{SYSLOGBASE2} %{DATA:message}" } # on ajoute des tags perso, pratique pour filtrer dans l'interface kibana add_tag => [ "syslog", "grokked" ] } } } output { # on stock dans elasticsearch elasticsearch { host => "localhost" } }
Finalisation de Logstash
chkconfig --level 2345 logstash on service logstash start
Rsyslog
Voici un fichier de configuration pour accépter les messages syslog du réseau et forwarder à logstash ces messages
# rsyslog v5 configuration file # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html # If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html #### MODULES #### $ModLoad imuxsock # provides support for local system logging (e.g. via logger command) $ModLoad imklog # provides kernel logging support (previously done by rklogd) #$ModLoad immark # provides --MARK-- message capability # Provides UDP syslog reception #on accepte les messages en UDP $ModLoad imudp $UDPServerRun 514 # Provides TCP syslog reception #on accepte les messages en TCP $ModLoad imtcp $InputTCPServerRun 514 #### GLOBAL DIRECTIVES #### # Use default timestamp format $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat # File syncing capability is disabled by default. This feature is usually not required, # not useful and an extreme performance hit #$ActionFileEnableSync on # Include all config files in /etc/rsyslog.d/ $IncludeConfig /etc/rsyslog.d/*.conf #### RULES #### # Log all kernel messages to the console. # Logging much else clutters up the screen. #kern.* /dev/console # Log anything (except mail) of level info or higher. # Don't log private authentication messages! *.info;mail.none;authpriv.none;cron.none /var/log/messages # The authpriv file has restricted access. authpriv.* /var/log/secure # Log all the mail messages in one place. mail.* -/var/log/maillog # Log cron stuff cron.* /var/log/cron # Everybody gets emergency messages *.emerg * # Save news errors of level crit and higher in a special file. uucp,news.crit /var/log/spooler # Save boot messages also to boot.log local7.* /var/log/boot.log # ### begin forwarding rule ### # The statement between the begin ... end define a SINGLE forwarding # rule. They belong together, do NOT split them. If you create multiple # forwarding rules, duplicate the whole block! # Remote Logging (we use TCP for reliable delivery) # # An on-disk queue is created for this action. If the remote host is # down, messages are spooled to disk and sent when it is up again. #$WorkDirectory /var/lib/rsyslog # where to place spool files #$ActionQueueFileName fwdRule1 # unique name prefix for spool files #$ActionQueueMaxDiskSpace 1g # 1gb space limit (use as much as possible) #$ActionQueueSaveOnShutdown on # save messages to disk on shutdown #$ActionQueueType LinkedList # run asynchronously #$ActionResumeRetryCount -1 # infinite retries if host is down # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional #*.* @@remote-host:514 #Forward a logstash *.* @@127.0.0.1:5544 # ### end of the forwarding rule ###
service rsyslog restart
Kibana
cd /var/www/html wget https://download.elasticsearch.org/kibana/kibana/kibana-3.1.0.tar.gz tar xzvf kibana-3.1.0.tar.gz chown -R apache:apache /var/www/html/kibana-3.1.0
Il faut savoir qu'Elasticsearch utilise le port 9200, donc deux solutions s'offre à nous, utiliser le port standard 9200 mais il faut que le flux soit ouvert à travers les différents du réseau ou utiliser les directives de mod_proxy qui va permettre de proxifier via le port 9200 via le port 80 et/ou 443 ce qui permet via HTTPS de sécuriser le flux.
Configuration Apache avec mod_proxy et config kibana
<LocationMatch "^/+$"> Options -Indexes ErrorDocument 403 /error/noindex.html </LocationMatch> ProxyPass /my_elasticsearch http://127.0.0.1:9200/ ProxyPassReverse /my_elasticsearch http://127.0.0.1:9200/
service httpd graceful
/** @scratch /configuration/config.js/1 * * == Configuration * config.js is where you will find the core Kibana configuration. This file contains parameter that * must be set before kibana is run for the first time. */ define(['settings'], function (Settings) { /** @scratch /configuration/config.js/2 * * === Parameters */ return new Settings({ /** @scratch /configuration/config.js/5 * * ==== elasticsearch * * The URL to your elasticsearch server. You almost certainly don't * want +http://localhost:9200+ here. Even if Kibana and Elasticsearch are on * the same host. By default this will attempt to reach ES at the same host you have * kibana installed on. You probably want to set it to the FQDN of your * elasticsearch host * * Note: this can also be an object if you want to pass options to the http client. For example: * * +elasticsearch: {server: "http://localhost:9200", withCredentials: true}+ * */ /**elasticsearch: "http://"+window.location.hostname+":9200",**/ elasticsearch: "//"+window.location.hostname+"/my_elasticsearch", /** @scratch /configuration/config.js/5 * * ==== default_route * * This is the default landing page when you don't specify a dashboard to load. You can specify * files, scripts or saved dashboards here. For example, if you had saved a dashboard called * `WebLogs' to elasticsearch you might use: * * default_route: '/dashboard/elasticsearch/WebLogs', */ default_route : '/dashboard/file/default.json', /** @scratch /configuration/config.js/5 * * ==== kibana-int * * The default ES index to use for storing Kibana specific object * such as stored dashboards */ kibana_index: "kibana-int", /** @scratch /configuration/config.js/5 * * ==== panel_name * * An array of panel modules available. Panels will only be loaded when they are defined in the * dashboard, but this list is used in the "add panel" interface. */ panel_names: [ 'histogram', 'map', 'goal', 'table', 'filtering', 'timepicker', 'text', 'hits', 'column', 'trends', 'bettermap', 'query', 'terms', 'stats', 'sparklines' ] }); });
Test de kibana :
Dans un shell du serveur taper la commande suivante :
logger "Test syslog pour kibana"
Cette commande va envoyer un texte au syslog local du serveur et l'on pourra vérifier dans kibana si cela s'affiche bien (via *Test* dans le champs Query en haut du dashboard).
Utilisez son navigateur et aller à l'adresse http://_Adresse_IP_du_serveur_/kibana-3.1.0/ et cliquer sur le lien "Sample Dashboard"
Il devrait apparaître dans la partie basse les messages syslog.
Voici le résultat :
Un prochain article traitera d'autres sujets sur ELK.
Bonus :
Les packages sur ma ressource ICI en cas de besoins ou sur GitHub.
Logs Elasticsearch : /var/log/elasticsearch/elasticsearch.log
Logs Logstash : /var/log/logstash/logstash.log