|
|
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 :
aptitude
|
aptitude install libapache2-mod-fcgid
|
3 Installation
Nous allons télécharger Thruk :
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 :
|
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 :
/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 :
/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" :
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 :
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 :
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 :
/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' :
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 :
ln
|
ln -s /usr/share/nagios/htdocs/images/logos/base /usr/share/thruk/themes/themes-available/Classic/images/logos/
|