[Outil sysadmin] Reed-alert

Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Yop tout le monde !

Mise à jour octobre 2016.
Nouveau nom pour le projet "reed-alert"

Site web : https://dataswamp.org/~solene/reed-alert/

Récupérer le projet :

Code : Tout sélectionner

git clone https://dataswamp.org/~solene/reed-alert/reed-alert.git
Configuration d'exemple

Code : Tout sélectionner

(defvar *alerts*
  (list
   '(dont-use-it ("REMINDER" function params date hostname description level os newline _ space result))
   '(void nil)
   '(mail nil)
   '(sms ("echo -n '" date _ function " CRITICAL " hostname "' | curl http://somewebservice"))
   '(mail ("echo -n '" date _ hostname " had problem on " function newline params _ " values " result newline
	   description "' | mail -s '[Error] " function  " - " hostname "' foo@bar.com"))
   '(with-plus ("echo -n '" + date + _ + hostname + " had problem on " + function + newline + params + newline
		+ description + "' | mail -s '[Error] " + function +  " - " + hostname + "' foo@bar.com"))))

(load "functions.lisp")

;; check if used percent :path partition is more than :limit
(=> mail disk-usage   (:path "/"    :limit 90))
(=> mail disk-usage   (:path "/usr" :limit 85))
(=> mail disk-usage   (:path "/tmp" :limit 1)) ;; failure

;; check if :path file exists
(=> mail file-exists  (:path "/bsd.rd" :desc "OpenBSD kernel /bsd.rd"))
(=> void file-exists  (:path "/non-existant-file")) ;; failure file not found

;; check if :path file exists and has been updated since :limit minutes
(=> void file-updated (:path "/var/log/messages" :limit 400))
(=> mail file-updated (:path "/bsd.rd"           :limit 1 :desc "OpenBSD kernel")) ;; failure

;; check if :path pid file process is running
(=> mail pid-running  (:path "/var/run/xdm.pid" :desc "XDM pid"))
(=> mail pid-running  (:path "/home/user/test.pid")) ;; failure

;; check if number of processes on the system is more than :limit
(=> mail number-of-processes (:limit 200))
(=> mail number-of-processes (:limit 1)) ;; failure

;; check if load average on (1/5/15) minutes is more than :limit
(=> mail load-average-1  (:limit 4))
(=> mail load-average-5  (:limit 2))
(=> mail load-average-15 (:limit 1))
(=> mail load-average-1  (:limit 0.2)) ;; should trigger error

;; check if :host host is reachable
(=> mail ping (:host "8.8.8.8"      :desc "Google DNS"))
(=> void ping (:host "2.3.4.256"    :desc "Not valid ipv4 address")) ;; fail error
(=> void ping (:host "127.40.30.21" :desc "Certainly not used address")) ;; fail time out

;; check if :command command return 0 (success) or something else (error)
(=> void command (:command "echo hello")) ;; success
(=> void command (:command "ls /non-existent-file")) ;; fail

(quit)
Dépendance : sbcl ou ecl

Suffit de lancer la commande

Code : Tout sélectionner

sbcl --load fichier_config.lisp
ou

Code : Tout sélectionner

ecl -load fichier_config.lisp
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

Yes ! bon c a

par contre j'ai tendance à voir plus complexe mais on déploie rarement ca sur un seul serveur ^^
j'avais pour idée de faire un peu la même chose mais basé sur une cmdb ou simple database

faire un système d'alarme que tu déploie simplement sur ton unix et qui va automatiquement chercher ses settings en fonction d'un groupe que tu aurai définie dans une cmdb (lié à l'ip ou hostname peut importe) et chaque groupe peut avoir plusieurs alarmes etc la possibilité de définir l'alarme que pour un seul hôte
bref un truc fait pour du déploiement massif ^^ avec la possibilité de faire une gestion graphique/web des paramètres

mais bon surement overkill pour la plupart des cas :D
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

c'est quoi un cmdb ? :D

on pourrait le rendre plus compliqué, mais là je vise plutôt les petites infrastructures ou les serveurs solos persos. Quand t'as une grosse infrastructure, c'est pas tout à fait le même besoin.

A réfléchir tout de même. Ça pourrait être assez facile d'aggréger les données et de distribuer les choses à faire depuis un serveur central.
J'ai pas commencé le développement, je préfère bien y réfléchir et voir les besoins pour essayer de couvrir au mieux, donc si tu as des idées vas y :)
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

pour le solo ouai ca m'intéresse de toute facon pour perso ausis :)
jvai pas me faire chier à déployer un truc enorme pour 4-5vm qui bougent jamais donc non pour le moment tout bon

+1 intéressé :D
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

à votre avis, il vaut mieux qu'il se lance toutes les minutes du même genre qu'un cron ou qu'il tourne 24/24 avec un timer et qu'il execute les tâches au besoin ?

faut aussi que je trouve un moyen pour qu'il évite de spammer d'alertes. Genre définir un seuil d'alertes ou un temps entre chaque alerte.
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

pour les alarmes jpense qu'il faut pouvoir régler
* n'envoyer que la première
* envoyer une fois tt les x occurrences
* envoyer une fois tt les x minutes

ou alors une option qui me semble mieux mais chiante à faire
c'est envoyer la première + une durée définie d'attente et si au bout de cette durée d'attente l'alarme est off = ca renvoi ok plus d'alarme
sinon ca attends de nouveau la durée d'attente et ainsi de suite
ca évite les rafales d'alarme et tu es prévenue quand c'est finit


pour le fonctionnement moi j'aime bien les cron :D plus simple à installer qu'avoir une appli qui tourne en permanence qu'il faut surveiller ou lancer
et/ou prévoir de relancer :sweat:
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

oui par un cron c'est mieux je pense, et puis ça évite d'avoir à surveiller que le truc est pas planté / déconne :D

alert = "/usr/local/bin/curl http://fournisseur_tel.com/sms.php?texte='$date $message'&num=060000000" once
notice = "echo $message | mail -t $subject monmail@mondomaine.com" every 3 interval
notice2 = "echo $message | mail -t $subject monmail@domaine.com" every 10 minutes
uber_grave = "mpg123 /home/zplay/alert.mp3"
on peut imaginer ça comme ça

"once" = une seule fois pendant le problème, par contre si ça fait ok / nok / ok / nok ça va spammer quand même
"every n minutes" = une fois toutes les n minutes
"every n interval" = une fois tous les n check de l'objet surveillé
"" (rien) = "every 1 interval" = à chaque interval

faudrait peut être pouvoir acquiter facilement du problème pour que ça arrête d'envoyer des alertes tant que c'est en panne aussi. Via une commande ? Gérer ça par le web ?
micha30000
Messages : 9418
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par micha30000 »

Des alertes de quoi ? Sur quel trigger ?
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

sur ce qui est écris dans le premier post :)
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Des alertes de quoi ? Sur quel trigger ?
normalement le fichier d'exemple parle de lui-même, enfin il est censé parler de lui-même :whistle:


pour le moment, je compte l'écrire en perl. C'est universel à tous les systèmes unix (me semble pas qu'un seul truc soit fourni sans perl). Par contre, je dois me limiter aux modules de base pour qu'il n'y ait aucune dépendance.
Etant donné qu'il faut garder certaines informations, surtout pour savoir si oui ou non cette alerte a déjà été faite la fois d'avant, je cherche un moyen efficace, simple et fiable pour garder ces données. Pour le moment, je partirais bien sur un CSV, ou alors tout bêtement mettre toutes les valeurs dans un hashref et le balancer dans un fichier, et le recharger à l'ouverture (ce serait plus simple et c'est fiable)
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

et une mini base locale sqlite ?
je dis ça car les système de monitoring qu'on déploie ont souvent ce type de conf (script perl + base sqlite)
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

et une mini base locale sqlite ?
je dis ça car les système de monitoring qu'on déploie ont souvent ce type de conf (script perl + base sqlite)
Faut un module perl à installer, j'aimerais que ça marche avec le script seul :/

Je pense utiliser le principe du dump de variable (comme la serialization d'objet en php si je dis pas de bétise). De toute façon, les données ne sont pas importantes.
D'ailleurs, je pourrais aussi garder X valeurs en mémoire si on veut tracer un minigraph (je sais pas comment sans installer de module encore :P) (ou un graph ascii avec des XXXXXXXXXXXX)


Je pourrais faire un paramètre aussi pour afficher le statut de la surveillance avec le nom du test, l'objet, et un OK ou un ERROR en vert/rouge histoire de pouvoir checker rapidement la machine quand on fait qqchose :)

/dir/truc       [_____________XXXXXXX] ERROR
service apache  [______X_____________] OK
micha30000
Messages : 9418
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par micha30000 »

normalement le fichier d'exemple parle de lui-même, enfin il est censé parler de lui-même :whistle:
Roh RTFM quoi, j'ai fait mon boulet :D J'ai tout lu sauf l'encadré ^^
C'est intéressant, ça répond à la majorité des besoins ! Si c'est simple à configurer je veux bien en parler au taf :whistle:
Avatar de l’utilisateur
lls
Messages : 1492
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par lls »

Pourquoi pas stocker les donnees dans des xml ? C'est facile à lire et peut être plus facile à exploiter non ?
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Pourquoi pas stocker les donnees dans des xml ? C'est facile à lire et peut être plus facile à exploiter non ?
c'est quand même lourd du xml non ? Surtout qu'au final ça va me donner une structure que je pourrais avoir dans un hashref.
Du genre ça :

Code : Tout sélectionner

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my %hash = (
    "exists /dir/truc" => [ 0, 0, 0, 1, 1, 1],
    "service apache" => [ 0, 0, 1, 0, 0 ,0],
    "service mongodb" => [ 1, 1, 1, 1, 1, 1]
    );

print Dumper \%hash;
je sauvegarde cela, et je peux le recharger dans ma variable %hash avec une seule ligne

version compacte
$VAR1 = {'service mongodb' => [1,1,1,1,1,1],'exists /dir/truc' => [0,0,0,1,1,1],'service apache' => [0,0,1,0,0,0]};
version longue lisible
$VAR1 = {
          'service apache' => [
                                0,
                                0,
                                1,
                                0,
                                0,
                                0
                              ],
          'service mongodb' => [
                                 1,
                                 1,
                                 1,
                                 1,
                                 1,
                                 1
                               ],
          'exists /dir/truc' => [
                                  0,
                                  0,
                                  0,
                                  1,
                                  1,
                                  1
                                ]
        };
Avatar de l’utilisateur
lls
Messages : 1492
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par lls »

L'intérêt que j'y vois c'est de pas être trop embêté par ce qu'il y a entre les balises et si tu veux mettre du détails d'info etc en faisant évoluer ton outils tu n'as pas trop de soucis avec les codes caractères parce que le csv avec des séparateurs ou des données fixes cela peu qq fois etr plus chiant. Ensuite si tu veux faire un gui avec un xml tu utiles un composant treeview et tu iras vite ;) mais ce n'est qu'une idée pour être plus léger qu'avec une petite base de données :)
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Le CSV c'est inutile et source d'ennuis de toute façon. Le Dump de variable ça serait la solution la plus simple.

A voir ce que peut apporter un XML. Pour une GUI, sur un serveur c'est un peu bizarre non ?
Avatar de l’utilisateur
lls
Messages : 1492
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par lls »

cela dépend si tu veux exporter ton contrôle sur une station cliente souvent on a les infos sur une station client et pas le serveur. Sinon tu passe en mode web car c'est beaucoup plus vendeur et sexy d'avoir une interface ;)

Sinon en fonction de toutes les alertes tu vas peut être aussi vouloir gérer un historique etc... ca dépend comment tu veux borner ton outil.

Après il y a peut être plus facile que le XML mais c'est vrai que pour éviter une base sqllite comme tu voulais faire je voyais peut être ca et ca permettait de tout maintenir par script :)
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Pour le moment, je prévois un outil unix de base, en général, ça va à l'encontre du sexy :D

Ajouter une interface web ça complique beaucoup les choses. Faut coder l'interface web (et en quoi ?) et pour faire quoi en fait ?

à la rigueur, on pourrait ajouter une commande qui écrit des stats dans un fichier qui pourrait être utilisé pour faire des graphs ou quelque chose, mais qui serait exploité par un autre outil par la suite.


quand tu voudrais dire exporter le controle ec serait du genre

[ sur un client ]
./openalarm --host serveur.truc infos ?
Avatar de l’utilisateur
poulpito
Messages : 12402
Inscription : ven. 12 janv. 2018 17:44
Localisation : Grenoble

[Outil sysadmin] Reed-alert

Message par poulpito »

+1 rester en cli ^^
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

+1 rester en cli ^^
ah oui c'est certain :D

je peux prévoir de générer des sorties de données ou d'enregistrer sous un certain format pour exploiter par des outils tiers.

Mais mon programme doit rester simple [:al0y] et KISS compliant
Image
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Je vais m'amuser à parser la config pour en tirer quelque chose tiens :o

je vais d'abord écrire le manuel de l'application, c'est le meilleur moyen pour commencer sans se planter :)
TheMartel
Messages : 7550
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par TheMartel »

Je pourrais tester à terme si tu veux.
Et faire de la traduction des manuel/autre vers anglais et espagnol.
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

Parsage du fichier de configuration :D

Code : Tout sélectionner

my $regex = qr/^(\w+) (\w+) \[(.*)\] (when)? (.*) interval (.*)/;
Avatar de l’utilisateur
Zedoune
Messages : 15343
Inscription : ven. 12 janv. 2018 17:44

[Outil sysadmin] Reed-alert

Message par Zedoune »

La regex, mais qui marche bien ce coup-ci (et permet de vérifier les erreurs de syntaxe dans le fichier de configuration)

Code : Tout sélectionner

my $rule = qr/^(?\w+)\s+(?.*)?\s*check\s+(?\w+)\s+\[(?[,."a-zA-Z0-9_*-\/|' ]+)\]\s*(when)?\s*(?.*)?\s*interval\s+(?.*)\s+((?minute|hour)s?)/;
Petit changement dans la syntaxe, le mot-clef check est ajouté devant le nom du test à effectuer

Code : Tout sélectionner

# lance une commande et compare le résultat
alert check cmd [ "load | cut -d ' ' -f 3" ] when > 5 interval 30 minutes


# vérifie le fonctionnement d'un ping ( si erreur ou > 5 ms) après avoir prix le résultat médian de 5 tentatives
alert median 5 check ping [ "8.8.8.8" ] when [> 15,error] interval 10 minutes
en fait, devant chaque partie optionnelles (median 5, ou le when) j'ai besoin d'un mot-clef pour faire le découpage de la chaîne.
Répondre