Description
Fonctionnalités
Références
Comparatif
Foire Aux Questions
Support
Feuille de route
Téléchargement
Documentation
Copies d'écran
Crédits
Recrutement
Contact
Liens
Ce guide a été réalisé en Juillet 2008 par un stagiaire CS.
Le but de ce document est de décrire comment installer les 6 premiers modules de Vigilo. C'est à dire poser les différentes commandes qui m'ont amené à l'installer et à le faire fonctionner, au moins avec une configuration basique.
L'installation est à l'origine prévue pour Debian, donc quelques modifications sont à prévoir pour Mandriva. C'est elles qui seront décrites ici.
On se base sur la configuration d'exemple de Nagios : /etc/nagios/conf.d/sample.cfg
/usr/share/vigilo-xxx/etc/vigilo-xxx/usr/libDe manière général j'utiliserai presque toujours un nom du genre “vigilo-nomdumodule” pour les répertoires, ceci afin de les identifier plus facilement.
Nagios v3.0.1 marche et sera utilisé dans ce tuto, mais il n'est pas officiellement validé par CS.
# urpmi nagios
Mot de passe nagios : # vi /etc/nagios/passwd.plaintext
Apache v2.2.8 (choix 1 = stable) : # urpmi apache
RRDTool v1.2.27 : # urpmi rrdtool
Python v2.5 : # urpmi python
Port utilisé : 50001
# tar -zxvf StoreMe-xx.tar.gz # cd StoreMe-xx
# mkdir /usr/share/vigilo-storeme # mv StoreMe.py /usr/share/vigilo-storeme
# mv storeme.sh /etc/init.d/ # vi /etc/init.d/storeme.sh
NAME=vigilo-storeme, variable PARMS, mettre PARMS=”/usr/share/vigilo-storeme/StoreMe.py”# mv storeme /etc/default # mkdir /etc/vigilo-storeme # mv /etc/vigilo-storeme/storeme.conf.py.dist /etc/vigilo-storeme/vigilo-storeme.conf.py
# mkdir /var/run/vigilo-storeme/. Le USER pour storeme est metro, donc :# useradd metro # chown -R metro:metro /var/run/vigilo-storeme/
# vi /etc/init.d/storeme.sh case "$1" in start) echo -n "Starting $DESC: " #start-stop-daemon --start --quiet --background --exec "$DAEMON" --pidfile "$PID_FILE" --chuid "$USER" --user "$USER" -- $PARMS #daemon --user "$USER" $DAEMON $PARMS nohup su -c "$DAEMON $PARMS" $USER & echo "$NAME." ;; stop) echo -n "Stopping $DESC: " #start-stop-daemon --stop --oknodo --quiet --exec "$DAEMON" --pidfile "$PID_FILE" --user "$USER" killproc -p "$PID_FILE" "$DAEMON" echo "$NAME." ;; restart|force-reload) # # If the "reload" option is implemented, move the "force-reload" # option to the "reload" entry above. If not, "force-reload" is # just the same as "restart". # echo -n "Restarting $DESC: " kill -p "$PID_FILE" "$DAEMON" sleep 1 daemon --pidfile "$PID_FILE" --user "$USER" $DAEMON $PARMS echo "$NAME." ;; *) N=/etc/init.d/$NAME echo "Usage: $N {start|stop|restart|force-reload}" >&2 exit 1 ;; esac
Il y a surement une meilleure façon de faire, mais je n'ai pas trouvé. Le start/stop marche mais pas le restart.
# /etc/init.d/storeme.sh start# urpmi perl# tar -zxvf Perf2Store-xx.tar.gz # cd Perf2Store-xx
# mv perf2store /usr/lib/nagios/plugins # vi /etc/nagios/conf.d/sample.cfg
SAMPLE PERFORMANCE DATA COMMANDS. # mv perf2store.conf.pm /etc/vigilo-perf2store/
Ce fichier est à renommer selon le hostname de la machine. Donc ici en perf-localhost.pm
# vi /etc/nagios/nagios.cfgLe fichier command.cfg contient les commandes Perf2Store avec le chemin (option -p) où se trouve les fichiers perf-host.pm.
C'est donc dans ce répertoire qu'il faut mettre les *.pm
Par rapport au sample.cfg de Nagios, on graphera donc : Load ; Users ; Web
# urpmi apache-mod_python# urpmi python-rrdtool# tar -zxvf RRDGraph-xx.tar.gz # cd RRDGraph # mkdir /usr/share/vigilo-rrdgraph # mv conf.py rrdgraph.py RRDGraph.py /usr/share/vigilo-rrdgraph
# ll /etc/vigilo-rrdgraph/ total 12 -rwxr-xr-x 1 apache apache 115 2008-04-21 16:00 general.py* -rwxr-xr-x 1 apache apache 2643 2008-01-24 17:12 graphs.py* -rwxr-xr-x 1 apache apache 2250 2008-01-24 17:12 templates.py*
# chown -R metro:apache /usr/share/vigilo-rrdgraph. Et le répertoire qui va contenir les rrds : # chown -R metro:apache /var/lib/rrds/.# mv rrdgraph.apache.conf /etc/httpd/conf.d/. Et mettre les bons droits.<IfModule mod_python.c> Alias /rrdgraph/cache/ /var/cache/vigilo-rrdgraph/ Alias /rrdgraph /usr/share/vigilo-rrdgraph <Directory /usr/share/vigilo-rrdgraph> AddHandler mod_python .py Order allow,deny Allow from all PythonHandler mod_python.publisher PythonDebug On DirectoryIndex rrdgraph.py </Directory> <Directory /var/cache/vigilo-rrdgraph> Order allow,deny Allow from all </Directory> </IfModule>
C'est dans /var/cache/vigilo-rrdgraph que sont générés les *.png de rrdtool
Il faut donc qu'apache puisse les lire pour les afficher.
NOTE : Il faut que storeme soit lancé pour ouvrir la page rrdgraph.
# tar -zxvf SupNavigator-xx.tar.gz # tar -zxvf qooxdoo-xx-sdk.tar.gz
# mv qooxdoo SupNavigator-xx/# urpmi make # urpmi gettext # urpmi apache-mod_proxy
# cd SupNavigator-xx/ # make build
# mkdir /usr/share/vigilo-supnavigator # mv build/* /usr/share/vigilo-supnavigator # chown -R apache:apache /usr/share/vigilo-supnavigator # chmod 755 /usr/share/vigilo-supnavigator/ # mv SupNavigator.py /usr/share/vigilo-supnavigator # chown -R apache:apache /usr/share/vigilo-supnavigator
# mv navconf.py.dist /etc/vigilo-supnavigator/navconf.py# mv apache.d/supnavigator.conf /etc/httpd/conf.d/Qui ressemblera dans notre exemple à :
<IfModule mod_python.c> Alias /supnavigator /usr/share/vigilo-supnavigator <Directory /usr/share/vigilo-supnavigator> AddHandler mod_python .py PythonHandler mod_python.publisher PythonDebug On Options FollowSymLinks AllowOverride AuthConfig Order Allow,Deny Allow From All </Directory> </IfModule>
Un reverse-proxy est un serveur proxy-cache “monté à l'envers”, permettant non pas aux utilisateurs d'accéder au réseau Internet, mais aux utilisateurs d'Internet d'accéder indirectement à certains serveurs internes.
Le reverse-proxy sert ainsi de relais pour les utilisateurs d'internet souhaitant accéder à un site web interne en lui transmettant indirectement les requêtes. Grâce au reverse-proxy, le serveur web est protégé des attaques directes de l'extérieur, ce qui renforce la sécurité du réseau interne. D'autre part, la fonction de cache du reverse-proxy peut permettre de soulager la charge du serveur pour lequel il est prévu.
Enfin, grâce à des algorithmes perfectionnés, le reverse-proxy peut servir à répartir la charge en redirigeant les requêtes vers différents serveurs équivalents; on parle alors de répartition de charge (en anglais load balancing).
Dans le cas Vigilo, pourquoi le RP ?
Dans le cadre d'un supervision répartie entre plusieurs serveurs Nagios, on va utiliser un RP entre l'IHM et les serveurs Nagios. Ce dernier jouera le rôle de relais. C'est lui qui va demander aux différents serveurs Nagios les données qu'on veut récupérer pour ensuite les afficher sur une IHM unique.
Dans notre installation nous n'avons qu'un serveur qui contient tout : IHM, Nagios, Graphes, etc. Il faut donc quand on interroge ce serveur, qu'il se renvoi les données à lui même.
# mv apache.d/supnavigator-proxy.conf /etc/httpd/conf.d/<Location /localhost/> Order Deny,Allow Allow from all ProxyPass http://localhost/ ProxyPassReverse http://localhost/ </Location>
# vi /usr/share/vigilo-supnavigator/SupNavigator.py INSTALL_ROOT = '/etc/vigilo-supnavigator'
# vi /usr/share/vigilo-supnavigator/SupNavigator.py
Il faut remplacer les chemins dans ces 2 définitions : def supPage ET def servicePage, soit : /%s/cgi-bin/nagios2/status.cgi par /%s/nagios/cgi-bin/status.cgi. Ceci afin que SupNav puisse ouvrir les pages Nagios.
# vi /etc/nagios/cgi.cfg
Modifier pour avoir ces valeurs :
default_user_name=* authorized_for_all_services=* authorized_for_all_hosts=*
http://localhost/supnavigator/# tar -zxvf DashboardInjector-xx.tar.gz # cd DashboardInjector/
# urpmi perl-Sys-Hostname-Long # urpmi socat
# mkdir /etc/vigilo-dashboardinjector/ # mv dashboardinjector /etc/vigilo-dashboardinjector/ # chmod 755 /etc/vigilo-dashboardinjector/
# vi /etc/vigilo-dashboardinjector/dashboardinjectorPID_FILE=/var/run/vigilo-dashboardinjector/vigilo-dashboardinjector.pid QUEUE_MAX_SZ=1024 THREAD_COUNT=1 TCP_PORT=50003 UDP_PORT=50003 DB_NAME="dbi:mysql:dashboard:127.0.0.1:3306" DB_USER="vigilo" DB_PASS="password"
# vi /etc/init.d/dashboardinjectorNAME=vigilo-dashboardinjector par : NAME=dashboardinjectorif [ -f /etc/default/$NAME ] ; then . /etc/default/$NAME fi
if [ -f /etc/vigilo-dashboardinjector/$NAME ] ; then . /etc/vigilo-dashboardinjector/$NAME fi
# ln -s /etc/vigilo-dashboardinjector/dashboardinjector /etc/default/vigilo-dashboardinjector# ll /etc/default/ total 8 -rw-r--r-- 1 csadm csadm 696 2008-06-30 11:08 storeme lrwxrwxrwx 1 root root 47 2008-07-02 15:57 vigilo-dashboardinjector -> /etc/vigilo-dashboardinjector/dashboardinjector*
# mkdir /usr/lib/vigilo-dashboardinjector/ # mv DashboardInjector.pl /usr/lib/vigilo-dashboardinjector/ # mv PerlDaemon.pm /usr/lib/vigilo-dashboardinjector/ # chown -R netadmin:apache /usr/lib/vigilo-dashboardinjector
# mv dashboardinjector.sh /etc/init.d/dashboardinjector# mkdir /var/run/vigilo-dashboardinjector/
Le USER pour dashboardinjector est netadmin, donc :
# useradd netadmin # chown -R netadmin:netadmin /var/run/vigilo-dashboardinjector
# /etc/init.d/dashboardinjector.sh startif [ -f /var/run/vigilo-dashboardinjector/vigilo-dashboardinjector.pid ] ; then DASH_PID=$(cat /var/run/vigilo-dashboardinjector/vigilo-dashboardinjector.pid) fi if [ -f /etc/default/$NAME ] ; then . /etc/default/$NAME fi set -e export PID_FILE QUEUE_MAX_SZ THREAD_COUNT TCP_PORT UDP_PORT DB_NAME DB_USER DB_PASS test -x $DAEMON || exit 0 set -e case "$1" in start) echo -n "Starting $DESC: " #start-stop-daemon --start --quiet --exec "$DAEMON" --pidfile "$PID_FILE" --chuid "$USER" --user "$USER" -- $ PARMS nohup su -c "$DAEMON $PARMS" $USER & echo "$NAME." ;; stop) echo -n "Stopping $DESC: " #start-stop-daemon --stop --oknodo --quiet --exec "$DAEMON" --pidfile "$PID_FILE" --user "$USER" kill "$DASH_PID" echo "$NAME." ;;
Ce n'est pas parfait et le restart ne marche pas. Mais le start/stop marche.
# tar -zxvf Dashboard-xx.tar.gz # cd Dashboard/
# mv dashboard.httpd.conf /etc/httpd/conf.d/
Editer ce fichier selon le répertoire web voulu (ici /usr/share/vigilo-dashboard/)
# mkdir /usr/share/vigilo-dashboard/ # mv share/* /usr/share/vigilo-dashboard/
# chown -R netadmin:apache /usr/share/vigilo-dashboard# mkdir /etc/vigilo-dashboard/ # mv config/dashboard.cfg /etc/vigilo-dashboard/
# vi /etc/vigilo-dashboard/dashboard.cfg, soit les parties : ”[General]”, ”[NEB]”, ”[Log]”, ”[Web]”.# mkdir /usr/lib/cgi-bin/dashboard # mv cgi-bin/alarms-form.cgi # chown -R netadmin:apache /usr/lib/cgi-bin/dashboard/
# urpmi perl-CGI # urpmi perl-Date-Calc
Un paquet pour Logfile/Rotate.pm est introuvable sur Mandriva : liblogfile-rotate-perl qui fournit des méthodes pour renommer et sauvegarder plusieurs versions de vos fichiers journaux. Il n'existe que sur Debian. Il faut donc l'installer depuis les sources.
# tar -zxvf liblogfile-rotate-perl_1.04.orig.tar.gz # cd liblogfile-rotate-perl_1.04.orig
# urpmi perl-ExtUtils-MakeMaker-Coverage# testcover Checking if your kit is complete... Looks good Writing Makefile for Logfile::Rotate cover -delete Deleting database /home/csadm/Téléchargement/Logfile-Rotate-1.04/cover_db cp Rotate.pm blib/lib/Logfile/Rotate.pm HARNESS_PERL_SWITCHES='-MDevel::Cover=-coverage,branch,-coverage,condition,-coverage,pod,-coverage,statement,-coverage,subroutine' PERL_DL_NONLAZY=1 /usr/bin/perl5.10.0 "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib/lib','blib/arch')" t/*.t t/01rotate..........ok t/02signal..........Signal is a deprecated argument, see Pre/Post at t/02signal.t line 25 t/02signal..........ok t/03compress........warning: could not load Compress::Zlib, skipping compression at t/03compress.t line 31 t/03compress........ok t/04dir.............ok t/05flock...........ok t/06persist.........ok t/07pre.............ok t/08post............ok t/09lib_compress....ok All tests successful. Files=9, Tests=115, 15 wallclock secs (14.25 cusr + 0.35 csys = 14.60 CPU) cover Reading database from /home/csadm/Téléchargement/Logfile-Rotate-1.04/cover_db ------------------------------------------ ------ ------ ------ ------ ------ File stmt bran cond sub total ------------------------------------------ ------ ------ ------ ------ ------ blib/lib/Logfile/Rotate.pm 87.1 57.6 81.0 93.3 76.2 Total 87.1 57.6 81.0 93.3 76.2 ------------------------------------------ ------ ------ ------ ------ ------ Writing HTML output to /home/csadm/Téléchargement/Logfile-Rotate-1.04/cover_db/coverage.html ... done.
# make # make install
# urpmi mysql> CREATE USER 'vigilo'@'localhost' IDENTIFIED BY '**';> CREATE DATABASE `dashboard`;> GRANT ALL PRIVILEGES ON `dashboard` . * TO 'vigilo'@'localhost';# mysql -u vigilo -pfucknt dashboard < dashboard.sql# mv perl/TrpHelpers.pm /usr/lib/cgi-bin/dashboard/ # chown apache.apache /usr/lib/cgi-bin/dashboard/TrpHelpers.pm
# chown -R apache:apache /var/log/dashboard/Pour que DashboardInjector puisse remonter les alertes sur le Dashboard il faut qu'il reçoive les données de Nagios. Pour celà on passe par la création d'une commande Nagios qui enverra les données au DashboardInjector.
A partir d'ici tout se fait dans le fichier /etc/nagios/conf.d/sample.cfg
define command{
command_name host-notify-dashinjector
command_line /usr/bin/printf "%b" "$HOSTNAME$|Host|$NOTIFICATIONTYPE$|$OUTPUT$|$HOSTSTATE$|" | socat -u - UDP4
:localhost:50003
}
define command{
command_name service-notify-dashinjector
command_line /usr/bin/printf "%b" "$HOSTNAME$|$SERVICEDESC$|$NOTIFICATIONTYPE$|$SERVICEOUTPUT$|$HOSTSTATE$|$SERVICESTATE$" | socat -u - UDP4:localhost:50003
}
$HOSTNAME$|Host|$NOTIFICATIONTYPE$|$OUTPUT$|$HOSTSTATE$| Nom_Hôte|Host|Notification_Etat|Sortie_Hôte|Etat_Hôte|Rien..
$HOSTNAME$|$SERVICEDESC$|$NOTIFICATIONTYPE$|$SERVICEOUTPUT$|$HOSTSTATE$|$SERVI CESTATE$ Nom_Hôte|Nom_Service|Notification_Etat|Sortie_du_Service|Etat_Hôte|Etat_Service
define contact{
contact_name dashinj
alias DashboardInjector
service_notification_period 24x7
host_notification_period 24x7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands service-notify-dashinjector
host_notification_commands host-notify-dashinjector
email root@localhost
}
define contactgroup{
contactgroup_name bots
alias Nagios Notification robots
members dashinj
}
Dans cet exemple, tout les autres contacts et groupes de contacts ont été commentés (#).
Les valeurs ont été choisie de manière à remonter les notifications pour voir rapidement les résultats sur le Dashboard. La détection des oscillations (flap) est désactivé, car si on veut tester les états changeront souvent. Et de nombreux changements désactivent les notifications temporairement, ce que nous ne voulons pas pour le Dahsboard.
define host{
name generic-host
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 0
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
notification_period 24x7
register 0
}
define host{
name linux-server
use generic-host
check_period 24x7
check_interval 2
retry_interval 1
max_check_attempts 1
check_command check-host-alive
#notification_period workhours (commenté, on veut du 24x7)
notification_interval 120
notification_options d,u,r
contact_groups bots
register 0
}
IMPORTANT : le groupe de contact est “bots” et les notifications sont actives !
contact_groups = bots et notifications_enabled = 1
define service{
name generic-service
active_checks_enabled 1
passive_checks_enabled 1
parallelize_check 1
obsess_over_service 1
check_freshness 0
notifications_enabled 1
event_handler_enabled 1
flap_detection_enabled 0
failure_prediction_enabled 1
process_perf_data 1
retain_status_information 1
retain_nonstatus_information 1
is_volatile 0
check_period 24x7
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
contact_groups bots
notification_options w,u,c,r
notification_interval 60
notification_period 24x7
register 0
}
define service{
name local-service
use generic-service
max_check_attempts 1
normal_check_interval 1
retry_check_interval 1
register 0
}
IMPORTANT : le groupe de contact est bots et les notifications sont actives !
contact_groups = bots et notifications_enabled = 1
On peut remplacer la commande check_local_load originale par : check_local_load!0.40,0.35,0.30!0.80,0.75,0.70
Afin d'amener facilement ce service comme étant problématique.
Ensuite un ping -f localhost devrait amener la charge en critical..
# vi /etc/my.cnf et commenter : skip-networkingNagios n'a pas besoin d'être lancé ici. On injecte de fausses alertes directement sans passer par lui pour voir si elles apparaissent bien dans le Dashboard.
On test directement en ligne de commande :
# /usr/bin/printf "%b" "localhost|SSH|PROBLEM|CRITICAL: test|UP|CRITICAL" | socat -u - UDP4:localhost:50003# /usr/bin/printf "%b" "localhost|SSH|RECOVERY|OK: test|UP|OK" | socat -u - UDP4:localhost:50003 <code> * En problème warning, elle devient orange <code bash> # /usr/bin/printf "%b" "localhost|SSH|PROBLEM|WARNING: test|UP|WARNING" | socat -u - UDP4:localhost:50003
# /usr/bin/printf "%b" "localhost|SSH|RECOVERY|OK: test|UP|OK" | socat -u - UDP4:localhost:50003Il semble y avoir un problème qui ne se manifeste pas toujours. En critique, il considère que nous sommes en warning, ça devrait être en rouge et non orange. De plus on constate que l'état le plus grave (en cliquant sur le triangle) est warning et non critical. Ou alors quand le service est OK il doit afficher le message de l'état le plus grave dans lequel il a été. Or ce n'est pas le cas.
Dans le Dashboard, le message de sortie persistant est le dernier état non OK dans lequel l'objet à été. Si il a été CRITICAL puis est passé directement OK après, alors le message de sortie sera celui du dernier CRITICAL. Si il a été CRITICAL, puis WARNING, puis OK alors c'est le message de sortie du WARNING qui persistera. Donc ce qui semble est un problème comme énoncé dans la Note 1, est en faite normal. (A été testé sur proto4 pour confirmation).
# tail -f /var/log/httpd/error.log# service nagios configtest