Thruk : Une interface évoluée pour Nagios et MKlivestatus

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
Thruk logo.png

Software version 1.30
Operating System Debian 6
Website Thruk Website
Last Update 30/05/2012
Others

1 Introduction

Thruk est une interface évoluée pour Nagios (et Shinken) qui permet de se connecter à plusieurs Nagios en même temps et d'afficher des informations plus pertinentes par rapport à l'interface standard de Nagios.

2 Prérequis

Voici les prérequis :

Command aptitude
aptitude install libapache2-mod-fcgid

3 Installation

Nous allons télécharger Thruk :

Command dpkg
wget http://www.thruk.org/files/pkg/v1.30/debian6/amd64/thruk_1.30_debian6_amd64.deb
dpkg -i thruk_1.30_debian6_amd64.deb

Vous pouvez maintenant vous connecter à l'interface Thruk : http://nagios/thruk/
Login et mot de passe : thrukadmin

4 Configuration

Nous allons dans un premier temps ajuster quelques droits pour éviter de futurs problèmes :

Command
chown www-data. /etc/thruk/thruk* /etc/thruk/cgi.cfg
chown -Rf nagios. /var/lib/nagios3
touch /etc/thruk/checkconfig
chown nagios:www-data /etc/thruk/checkconfig

4.1 Apache LDAP

Vous avez peut être envie de coller LDAP sur Thrunk, tout comme votre Nagios. C'est assez simple :

Configuration File /etc/apache2/conf.d/thruk.conf
<IfModule mod_fcgid.c>
  AddHandler fcgid-script .sh
 
  <Directory /usr/share/thruk>
    Options FollowSymLinks
    AllowOverride All
    order allow,deny
    allow from all
  </Directory>
  <Directory /etc/thruk/themes>
    Options FollowSymLinks
    allow from all
  </Directory>
  <Directory /etc/thruk/plugins>
    Options FollowSymLinks
    allow from all
  </Directory>
 
  # redirect to a startup page when there is no pidfile yet
  RewriteEngine On
  RewriteCond %{REQUEST_METHOD} GET
  RewriteCond %{REQUEST_URI} !^/thruk/startup.html
  RewriteCond %{REQUEST_URI} !^/thruk/side.html
  RewriteCond %{REQUEST_URI} !^/thruk/.*\.(css|png|js)
  RewriteCond %{REQUEST_URI} ^/thruk
  RewriteCond /var/cache/thruk/thruk.pid !-f
  RewriteRule ^(.*)$ /thruk/startup.html?$1 [R=302,L,NE,QSA]
 
  Alias /thruk/documentation.html /usr/share/thruk/root/thruk/documentation.html
  Alias /thruk/startup.html /usr/share/thruk/root/thruk/startup.html
  AliasMatch ^/thruk/(.*\.cgi|.*\.html)  /usr/share/thruk/fcgid_env.sh/thruk/$1
  AliasMatch ^/thruk/plugins/(.*?)/(.*)$  /etc/thruk/plugins/plugins-enabled/$1/root/$2
  Alias /thruk/themes/  /etc/thruk/themes/themes-enabled/
  Alias /thruk /usr/share/thruk/root/thruk
 
  <Location /thruk>    Options ExecCGI  </Location>   <DirectoryMatch (/usr/share/thruk/root/thruk|/etc/thruk/themes/themes-enabled/)>    Options FollowSymLinks    #DirectoryIndex index.php     AllowOverride AuthConfig    Order Deny,Allow    Deny From All    Allow From 127.0.1.1    Allow From 127.0.0.1     AuthName "Thruk Access"    AuthType Basic    AuthBasicProvider ldap     AuthzLDAPAuthoritative on    AuthLDAPURL ldap://openldap.deimos.fr/dc=openldap,dc=deimos,dc=fr?uid?sub?(objectClass=posixAccount)    AuthLDAPRemoteUserIsDN off     AuthLDAPGroupAttribute memberUid    AuthLDAPGroupAttributeIsDN off     Require ldap-group ou=Groups,dc=openldap,dc=deimos,dc=fr    Require ldap-user nagiosadmin     Satisfy Any   </DirectoryMatch> 
</IfModule>

4.2 Thruk

Pour la configuration de Thruk, il existe 2 fichiers importants :

  • thruk.conf : La configuration générale
  • thruk_local.conf : La configuration personnalisée

D'après la doc officielle, il est préférable de ne pas toucher à la configuration générale et d'overrider certains paramètres avec la configuration personnalisée.

Voici une configuration de base pour que ça fonctionne avec MK Livestatus :

Configuration File /etc/thruk/thruk_local.conf
############################################
# put your own settings into this file
# settings from this file will override
# those from the thruk.conf
############################################
 
# Interface Options
default_theme       = Exfoliation
use_timezone = CET
use_ajax_search = 1
use_new_search = 1
info_popup_event_type = onmouseover
show_modified_attributes = 1
show_long_plugin_output = inline
show_full_commandline = 2
 
# Backends to Mklivestatus
<Component Thruk::Backend>
    <peer>
        name   = Local Nagios
        type   = livestatus
        <options>
            peer          = /var/lib/nagios3/rw/live
            resource_file = /etc/nagios3/resource.cfg
       </options>
       <configtool>
            core_conf      = /etc/nagios3/nagios.cfg
            obj_check_cmd  = /usr/sbin/nagios3 -v /etc/nagios3/nagios.cfg
            obj_reload_cmd = /etc/init.d/nagios3 reload
       </configtool>
    </peer>
</Component>

Vous pouvez ajouter plusieurs Peer pour avoir une interface unique et plusieurs serveurs Nagios. Une fois que vous aurez la main sur l'interface de Thruk, vous pourrez configurer toutes ses options directement depuis cette interface, ainsi que celles de Nagios.

Reloadez ensuite apache pour que les modifications soient prisent en compte.

4.3 Interface minimale pour écrans de supervision

J'avais déjà abordé dans la doc sur Nagios des solutions pour avoir un écran assez minimal. Le soucis c'est que ce n'est toujours pas suffisant et avec Thruk heureusement il y a moyen de corriger ce petit problèmes sans avoir à recoder les 3/4 du programme. J'ai donc créer un petit patch que j'ai soumis à l'équipe de Thruk (qui vient d'être accepté https://github.com/sni/Thruk/commit/d1eefef82cd8fbab6ebebff8a570bb1e026d1a9f mais ne sera dispo que dans la prochaine release (1.28)), alors en attendant, voici comme avoir une interface la plus minimal possible.

Voici un premier patch pour modifier les module Perl de Thruk afin qu'il prenne en compte un nouveau paramètre dans l'URL appelé "minimal" :

Configuration File Thruk_perl_modules.patch
diff -Nru old/Root.pm new/Root.pm
--- old/Root.pm 2012-04-06 13:05:08.000000000 +0200
+++ new/Root.pm 2012-04-06 13:05:16.000000000 +0200
@@ -215,6 +215,9 @@
     }
     $c->stash->{hidetop} = $c->{'request'}->{'parameters'}->{'hidetop'} || '';
 
+       # Add custom monitor screen function
+    $c->stash->{minimal} = $c->{'request'}->{'parameters'}->{'minimal'} || '';
+
     # initialize our backends
     unless ( defined $c->{'db'} ) {
         $c->{'db'} = $c->model('Thruk');
diff -Nru old/status.pm new/status.pm
--- old/status.pm       2012-04-06 13:05:08.000000000 +0200
+++ new/status.pm       2012-04-06 13:05:21.000000000 +0200
@@ -744,6 +744,9 @@
     $c->stash->{hidetop}    = 1 unless $c->stash->{hidetop} ne '';
     $c->stash->{hidesearch} = 1;
 
+    # Monitor screen interface
+    $c->stash->{minimal}    = 1 unless $c->stash->{minimal} ne ''; 
+
     # which host to display?
     my( $hostfilter)           = Thruk::Utils::Status::do_filter($c, 'hst_');
     my( undef, $servicefilter) = Thruk::Utils::Status::do_filter($c, 'svc_');

Et ensuite nous allons modifier l'interface pour que les changements s'appliquent que sur une partie du code :

Configuration File Thruk_interface.patch
diff -Nru old/_header.tt new/_header.tt
--- old/_header.tt      2012-04-06 13:39:31.000000000 +0200
+++ new/_header.tt      2012-04-06 13:37:44.000000000 +0200
@@ -192,14 +192,18 @@
         </tr>
       </table>
     </td>
+       [% UNLESS minimal == 1 %]
     <td>
       <input type="image" src="[% url_prefix %]thruk/themes/[% theme %]/images/arrow_refresh.png" class="top_refresh_button" onClick="refresh_button(this)" alt="refresh this page" title="refresh this page">
     </td>
     <td class="top_nav_pref">
       <input type="button" class="top_nav_pref_button" value="preferences" title="preferences" onMouseOver="button_over(this)" onMouseOut="button_out(this)" onClick="toggleElement('pref_pane'); return false;">
     </td>
+       [% END %]
   </tr>
 </table>
+[% UNLESS minimal == 1 %]
 [% IF page == 'status' || page == 'statusmap' %]
 <a href="#" onClick="toggleTopPane(); return false;"><img src="[% url_prefix %]thruk/themes/[% theme %]/images/icon_minimize.gif" class="btn_toggle_top_pane" id="btn_toggle_top_pane" alt="toggle header"></a>
 [% END %]
+[% END %]
diff -Nru old/status_detail.tt new/status_detail.tt
--- old/status_detail.tt        2012-04-06 13:37:10.000000000 +0200
+++ new/status_detail.tt        2012-04-06 13:37:24.000000000 +0200
@@ -12,6 +12,7 @@
 
 [% PROCESS _overdiv.tt %]
 [% PROCESS _status_cmd_pane.tt %]
+[% UNLESS minimal == 1 %]
     <table border="0" width="100%" cellspacing="0" cellpadding="0" id="top_pane"[% IF hidetop == 1 %]style="visibility:hidden; display:none;"[% END %]>
       <tr>
         <td align="left" valign="top" width="33%">
@@ -103,9 +104,11 @@
         </td>
       </tr>
     </table>
+       [% END %]
 
     [% PROCESS _status_detail_table.tt %]
 
+       [% UNLESS minimal == 1 %]
     [% UNLESS authorized_for_read_only %]
     <div class="hint">
         <a href="#" onclick="selectAllServices(true,'[% paneprefix %]');return false;">select all</a> (<a href="#" onclick="selectAllHosts(true,'[% paneprefix %]');">hosts</a>)
@@ -118,6 +121,7 @@
     <div align="center">[% PROCESS _pager.tt %]</div>
 
     <br>
+       [% END %]
     <div class='itemTotalsTitle'>[% IF !has_error && data.size %][% data.size %] of [% pager.total_entries %][% ELSE %]0[% END %] Matching Service Entries Displayed</div>
 
 [% PROCESS _footer.tt %]

Et c'est parti, on va tout patcher :

Command patch
patch -d /usr/share/thruk/lib/Thruk/Controller/ < Thruk_perl_modules.patch
patch -d /usr/share/thruk/templates/ < Thruk_interface.patch

Maintenant, il ne vous reste plus qu'à mettre "&minimal=1" à la fin de votre URL thrunk pour qu'il dégage tout ce qui est innutile. Exemple :

http://nagios/thruk/cgi-bin/status.cgi?host=all&type=detail&hostprops=10&serviceprops=42&servicestatustypes=28&hidetop=1&minimal=1

4.4 Ajouter un CGI personnalisé

Dans certains cas, vous pouvez avoir certains checks qui stockent temporairement des informations sur le serveur Nagios et vous souhaitez pouvoir exécuter des actions depuis l'interface Nagios. Pour cela, il existe l'option 'action_url' sur lequel nous allons pouvoir lui donner une URL ou se trouve un cgi qui exécutera ce que l'on veut, avec pourquoi pas des options.

Pour commencer, nous allons créer notre CGI. Voici un exemple minimaliste ou je supprime un fichier temporaire :

Configuration File /usr/lib/cgi-bin/nagios3/remove.cgi
#!/usr/bin/perl 
 
use CGI;
$query = CGI::new();
$host = $query->param("host");
 
# Avoid inputing special characters that would crash the program
if ( $h =~ /\`|\~|\@|\#|\$|\%|\^|\&|\*|\(|\)|\:|\=|\+|\"|\'|\;|\<|\>/ ) { 
    print "Illegal special chars detected. Exit\n";
    exit(1);
}
 
print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<HEAD><Title>Removing $host temporary file</Title>\n";
print "<LINK REL='stylesheet' TYPE='text/css' HREF='/nagios/stylesheets/common.css'><LINK REL='stylesheet' TYPE='text/css' HREF='/nagios/stylesheets/status.css'>\n";
print "</HEAD><BODY>\n";
print "Removing $host Interface Network Flapping temporary file...";
if (-f "/tmp/iface_state_$host.txt")
{
    unlink("/tmp/iface_state_$host.txt") or print "FAIL<br />/tmp/iface_state_$host.txt : $!\n" and exit(1);
    print "OK\n";
}
else
{
    print "FAIL<br />/tmp/iface_state_$host.txt : No such file or directory\n";
}
print "</body></html>\n";

Et puis dans la configuration du service en question, j'insère mon 'action_url' :

Configuration File nagios_config.cfg
define service{
         use                             generic-services-ulsysnet
         hostgroup_name                  network
         service_description             Interface Network Flapping
         check_period                    24x7
         notification_period             24x7
 	 _SNMP_PORT			 161
	 _SNMP_COMMUNITY		         public
         _DURATION			 86400
         check_command                   check_interface_flapping
         # For Thruk & Nagios	 # action_url			 ../../cgi-bin/nagios3/remove.cgi?host=$HOSTADDRESS$         # For Nagios only                        action_url			 remove.cgi?host=$HOSTADDRESS$}

Il ne vous reste plus qu'à reloader Nagios.

Vous remarquerez que pour Thruk, j'ai trouvé une méthode facile mais pas super propre, qui consiste à réécrire l'url pour pointer vers le liens Nagios. Pour une méthode propre, il faudrait écrire un plugin dédié.

5 FAQ

5.1 Les logos des OS ne s'affichent plus

Visiblement dans le package Debian de cette version de Thruk, il y a un petit soucis pour l'affichage des icones des OS. Pour y remédier, nous allons créer un lien symbolique :

Command ln
ln -s /usr/share/nagios/htdocs/images/logos/base /usr/share/thruk/themes/themes-available/Classic/images/logos/