Configurer la gestion d'un onduleur
Auteur : Olivier BOYER - oboyer () ajoute ! org
Mots clés
OpenBSD, Onduleur, Network UPS Tools, NUT, Merlin Gerin
Introduction
Ce document décrit comment installer et configurer l'outil de gestion d'un onduleur NUT (Network UPS Tools) sur un système OpenBSD 4.3.
Un onduleur améliore la sécurité de fonctionnement d'un serveur :
- il “lisse” le courant électrique qui alimente le serveur. Il protège contre les micro-coupures et les pics de tensions,
- il protège les disques durs des arrêts brutaux du serveur,
- il intègre un système de protection contre la foudre.
Cependant un onduleur n'apportera jamais la même qualité de service qu'un groupe électrogène. Sa puissance électrique est bien moindre. A titre d'exemple, un onduleur d'une puissance de 2200W (prix public d'environ 2000 Euros TTC), chargé en sortie à 40% (soit 6 serveurs), fournit de l'électricité pendant environ 30 minutes. Il faut donc considérer un onduleur comme un outil permettant d'arrêter proprement les machines qui y sont raccordées en cas de coupure électrique.
Présentation de la maquette
- Une machine sous OpenBSD 4.3
- Un onduleur Merlin Gerin Ellipse 750 USBS
- L'état de l'onduleur est remonté à la machine via le port série.
Note
Toutes les commandes présentées ici, sont à exécuter, sauf mention contraire, en tant qu'administrateur de la machine.
Pré-requis
- Un système d’exploitation OpenBSD 4.3 installé et fonctionnel.
- Un port série disponible.
- Le câble série de l'onduleur fournit par Merlin Gerin.
Schéma fonctionnel des composants
PROCESS CLIENTS
[upsmon, upsc, upsrw, upsstats, upsset, ... (via upsclient)]
|
<échange réseau via une socket de type "INET", port tcp/3493>
|
SERVEUR
[upsd]
|
<échange de message textes via une socket de type "Unix">
|
DRIVERS
[mge-shut, apcsmart, bestups, powercom, ...]
|
<communication série, SNMP, USB, ...>
|
ONDULEUR
<MGE-Ellipse 750, Smart-UPS 700, ...>
Installation du package
Pour installer le package, exécutez les commandes suivantes :
# export PKG_PATH="ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/i386/"
# pkg_add nut
libusb-0.1.12: complete
nut-2.2.1p0: complete
--- nut-2.2.1p0 -------------------
Once you have the config files under /etc/nut set up properly, the
following block can be added to your /etc/rc.local file to start nut.
# Start Nut
if [ -x /usr/local/bin/upsdrvctl ]; then
echo -n ' nut'
/usr/local/bin/upsdrvctl start > /dev/null 2>&1
/usr/local/sbin/upsd > /dev/null 2>&1
/usr/local/sbin/upsmon > /dev/null 2>&1
fi
You may also be interested in the "-i" flag to upsd, see upsd(8).
Lors de l'installation, le user '_ups' est créé :
_ups:*:529:10:UPS User:/var/empty:/sbin/nologin
Les documentations d'installation de nut font références au répertoire /var/state/ups comme lieu de stockage de l'état du serveur et des drivers. Dans la cas d'OpenBSD, ce répertoire est fixé lors de la compilation à /var/db/nut. Voir le fichier /usr/ports/sysutils/nut/Makefile pour plus de détails.
Configurer le package 'nut'
Le schéma fonctionnel de l'architecture de nut présenté plus haut, a fait apparaître une architecture en couche, dans laquelle plusieurs éléments coopèrent pour gérer un onduleur. Cette section présente la configuration de chacun de ces éléments. Il est indispensable de se référer au schéma pour bien comprendre le rôle de chaque composant.
Modifier le fichier /etc/nut/ups.conf
Le fichier /etc/nut/ups.conf est lu par le contrôleur du driver upsdrvctl(8). Il défini le driver à utiliser pour gérer l'onduleur, ainsi que le port de communication qui relie la machine à l'onduleur.
Dans cette maquette, l'onduleur utilisé est un MGE ELLIPSE 750 USBS, géré par le driver mge-shut(8), et relié à la machine via le premier port série.
Pour configurer le driver, ajouter les lignes suivantes à la fin du fichier /etc/nut/ups.conf :
[mge_ellipse]
driver = mge-shut
port = /dev/tty00
desc = "MGE Ellipse 750USBS"
#EOF
Pour plus de détails, consultez la page de manuel ups.conf(5).
Modifier le fichier /etc/nut/upsd.conf
Le fichier /etc/nut/upsd.conf est utilisé par upsd(8) pour gérer ses contrôles d'accès. Il permet aussi de définir deux autres variables :
MAXAGE: définit le nombre de secondes (15par défaut) avant queupsd(8)considère que le driver ne répond plus,STATEPATH: définit l'emplacement de la socket du driver (/var/db/nutpar défaut sous OpenBSD).
Dans notre maquette, une seule machine est gérée par l'onduleur, et elle est connectée à ce dernier par le port série. Il n'y a donc pas d'accès réseau au serveur upsd(8). Les règles d'accès par défaut conviennent à notre utilisation.
Par contre, il y a problème connu avec les onduleurs MGE Ellipse. Le protocole de communication SHUT est très verbeux, et il arrive que le driver n'ai pas le temps de tout traiter durant l'intervalle de lecture par défaut d'upsd(8). Il faut donc, augmenter la variable MAXAGE de 15 à 25. Pour plus de détails, consultez la page de manuel mge-shut(8).
Le fichier /etc/nut/upsd/conf doit donc être semblable à celui ci-dessous :
#/etc/nut/upsd.conf # ============================= # Access Control Lists (ACLs) # ACL <name> <ipblock> # ACL myhost 10.0.0.1/32 # # ACCEPT <aclname> [<aclname>...] # REJECT <aclname> [<aclname>...] ACL all 0.0.0.0/0 ACL localhost 127.0.0.1/32 ACCEPT localhost REJECT all # ============================= # MAXAGE <seconds> # Known issue whith mge-shut driver. See mge-shut(8). MAXAGE 25 #EOF
Modifier le fichier /etc/nut/upsd.users
Le fichier /etc/nut/upsd.users défini :
- les utilisateurs autorisés à accéder au daemon
upsd(8), - le mot de passe associé à chaque utilisateur,
- la liste des machines depuis lesquelles les utilisateurs sont autorisés à accéder au serveur
upsd(8), - le type d'actions autorisées (lecture et/ou écriture de variables sur l'onduleur).
Les utilisateurs définis dans le fichier /etc/nut/upsd.users sont utilisés par tous les clients du daemon upsd(8), donc par toutes les commanes ups*.
Il est recommandé de créer au moins un utilisateur d'administration et un utilisateur de monitoring. Pour ce faire, ajoutez les lignes suivantes à la fin du fichier /etc/nut/ups.users :
# Supervision user
[admin]
password = mypass
allowfrom = localhost
actions = SET
instcmds = ALL
# State user
[monuser]
password = mypass
allowfrom = localhost
upsmon master
#EOF
Modifier le fichier /etc/nut/upsmon.conf
Présentation d'upsmon(8)
Le processus upsmon(8) est sans doute le plus important de la suite nut. En effet, c'est lui qui interroge le daemon upsd pour connaître l'état de l'onduleur, sa charge de batterie, et qui détermine s'il faut arrêter ou non les machines.
Pour chaque état de l'onduleur (définis via les NOTIFYFLAGS), upsmon(8) peut appeler une commande externe (définie via la variable NOTIFYCMD) pour réaliser les actions souhaitées par l'administrateur. Il est important de noter que la notification de changement d'état est indiquée par upsmon(8) au programme externe qu'une seule fois, lors du changement d'état.
Dans la configuration par défaut, upsmon(8) gère deux états :
ONBAT: quand le courant électrique disparaît et que la batterie de l'onduleur prend le relais pour alimenter les machines,LOWBAT: quand le niveau de batterie de l'onduleur est faible, et qu'il devient urgent d'arrêter les machines.
Par défaut, quand upsmon(8) détecte un niveau de batterie faible il envoie le signal FSD (Force SutDown) à toutes les machines branchées sur l'onduleur, et exécute la commande définie par la variable SHUTDOWNCMD (par défaut /sbin/shutdown -h +0).
Configuration d'upsmon(8)
Dans notre maquette, une seule machine est branchée sur l'onduleur. Le comportement par défaut qui consiste à arrêter la machine qu'en cas de niveau de batterie faible convient donc parfaitement.
Pour gérer l'onduleur qui est raccordé à la machine locale, ajouter les lignes suivantes à la section MONITOR du fichier /etc/nut/upsmon.conf :
MONITOR mge_ellipse@localhost 1 monuser mypass master
Cette ligne est de la forme :
MONITOR system powervalue username password type
où :
system: est le nom du l'onduleur défini dans le fichier/etc/nut/ups.conf, associé au nom de la machine à laquelle il est relié (via le port série dans cette maquette),powervalue: le nombre d'onduleur branché sur la machine (en général 1),usernameetpassword: définis dans le fichier/etc/nut/upsd.users,type: prend la valeurmastersi l'onduleur est géré par la machine locale, sinon, la valeurslave.
Pour plus d'informations, consultez les pages de manuel upsmon(8) et upsmon.conf(5).
Modifier la définition de l'utilisateur '_ups'
Par défaut l'utilisateur _ups est membre du groupe users. Or, le groupe users est le groupe primaire des utilisateurs physiques du système. Pour des raisons de sécurité, il vaut mieux attribuer à l'utilisateur _nut un groupe plus restreint. L'onduleur est supervisé via le port série. Le groupe dialer, qui par défaut à le droit d'écriture sur les périphériques série, apparaît comme un meilleur candidat.
A l'aide de la commande vipw(8), modifiez le groupe primaire en l'utilisateur _ups du groupe 10 en 117. Une fois la modification effectuée, la définition de l'utilisateur _ups doit être semblable à celle ci-dessous :
# grep ^_ups /etc/passwd _ups:*:529:117:UPS User:/var/empty:/sbin/nologin
Modifier les permissions
Modifier les permissions du périphérique série
Les daemons mis en ouvre dans le package nut peuvent avoir besoin de positionner certaines variables directement dans l'onduleur. Pour cela, il faut que l'utilisateur _ups ait le droit d'écrire sur le port série.
Modifiez comme suit les permissions du port série.
# ls -l /dev/tty00 crw-rw---- 1 uucp dialer 8, 0 Jan 12 11:23 /dev/tty00 # # chown _ups /dev/tty00
Modifier les permissions du répertoire /etc/nut
Le répertoire /etc/nut regroupe les fichiers de configuration du package nut. Certains de ces fichiers contiennent des informations sensibles, comme les couples utilisateur / mot de passe autorisés à accéder au daemon upsd(8).
Pour des raisons de sécurité, il est indispensables que tous les fichiers de configuration soient accessibles en lecture et écriture qu'au seul utilisateur _ups. C'est le cas par défaut. Pour plus de tranquillité, il est préférable d'interdire l'accès au répertoire /etc/nut à tous les utilisateurs, sauf au membre du groupe dialer (nouveau groupe primaire de l'utilisateur _ups).
Exécutez les commandes suivantes :
# ls -ld /etc/nut drwxr-xr-x 2 root wheel 512 Dec 15 17:32 /etc/nut # # chgrp dialer /etc/nut # chmod 750 /etc/nut # # ls -ld /etc/nut drwxr-x--- 2 root dialer 512 Dec 15 17:32 /etc/nut
Tester les configurations
Démarrer les daemons
Pour démarrer les services de gestion de l'onduleur “à la main” et en mode debug, exécutez les commandes suivantes :
# /usr/local/bin/upsdrvctl start # /usr/local/sbin/upsd # /usr/local/sbin/upsmon -DDD
Interroger l'onduleur
Les commandes présentées ci-dessous peuvent être exécutées en tant qu'utilisateur non privilégié.
Pour afficher l'ensemble des variables de l'onduleur, exécutez la commande suivante :
$ upsc mge_ellipse@localhost
Pour afficher l'état de l'onduleur, procédez comme suit :
$ upsc mge_ellipse@localhost ups.status OL CHRG
Pour afficher la charge de la batterie, exécuter la commande suivante :
$ upsc mge_ellipse@localhost battery.charge 100
Intégrer le service au système
Maintenant que le serveur fonctionne, il faut configurer le système OpenBSD pour qu’il démarre automatiquement le serveur upsd, gère ses fichiers d’enregistrements et surveille les modifications des fichiers de configuration.
Créer un script de démarrage
La gestion d'un onduleur nécessite le démarrage de plusieurs daemons. Le plus simple est de créer un script de démarrage personnalisé.
Pour ce faire, créez le répertoire /etc/rc.d comme suit :
# mkdir /etc/rc.d # chown root:wheel /etc/rc.d # chmod 750 /etc/rc.d
Puis, créez comme suit, le fichier de démarrage : /etc/rc.d/nut.
Et enfin, positionnez les permissions :
# chown root:wheel /etc/rc.d/nut # chmod 740 /etc/rc.d/nut
Modifier le fichier /etc/rc.local
Pour lancer automatiquement la gestion de l'onduleur au démarrage de la machine, ajoutez les lignes suivantes au début du fichier /etc/rc.local :
# Start nut (UPS manager)
if [ -x /etc/rc.d/nut ]; then
echo -n ' nut'; /etc/rc.d/nut start & >/dev/null
fi
Modifier le fichier /etc/rc.shutdown
Pour arrêter la gestion de l'onduleur à l'arrêt de la machine, ajoutez les lignes suivantes à la fin du fichier /etc/rc.shutdown :
# Stop nut (UPS manager)
if [ -x /etc/rc.d/nut ]; then
echo -n ' nut'; /etc/rc.d/nut stop >/dev/null
fi
Modifier le fichier /etc/changelist
Pour que le système OpenBSD surveille les modifications apportées au script de démarrage et aux fichiers de configuration du service de gestion de l'onduleur, ajoutez les lignes suivantes au fichier /etc/changelist :
/etc/rc.d/nut /etc/nut/ups.conf /etc/nut/upsd.conf /etc/nut/upsd.users /etc/nut/upsmon.conf /etc/nut/upssched.conf
Vérifier l'état de l'onduleur via Nagios
Ce chapitre considère que nagios est installé est fonctionnel. Pour plus d'information sur l'installation et la configuration de nagios, reportez-vous à la page suivante : Installer et configurer le système de supervision Nagios.
Vérifier que Nagios est installé
Pour vérifier que le système de supervision Nagios est installé sur le système, exécutez les commandes suivantes :
# pkg_info |grep nagios nagios-2.5-chroot host and service monitor nagios-plugins-1.4.3p2 nagios base plugins nagios-web-2.5-chroot cgis and webpages for nagios
Utiliser le plugin 'check_ups'
Le plugin check_ups permet de suivre l'état de l'onduleur. Pour connaître ses paramètres d'exécution, procédez comme suit :
$ /usr/local/libexec/nagios/check_ups
Usage: check_ups -H host -u ups [-p port] [-v variable]
[-wv warn_value] [-cv crit_value] [-to to_sec] [-T]
Pour connaître l'état de l'onduleur, exécutez la commande suivante :
$ /usr/local/libexec/nagios/check_ups -H localhost -u mge_ellipse UPS OK - Status=Online, Charging Batt=32.0% Load=0.0% | battery=32%;;;0;100 load =0%;;;0;100
Modifier la configuration de Nagios
Déterminer le fichier de définitions de Nagios
Pour intégrer la vérification de l'état de l'onduleur, il faut modifier le fichier de configuration des services supervisés par Nagios. Pour connaître le nom de ce fichier, exécutez la commande suivante :
# grep ^cfg_file /etc/nagios/nagios.cfg cfg_file=/etc/nagios/minimal.cfg
Modifier le fichier de définition de Nagios
Modifiez comme suit le fichier indiqué plus haut.
Dans la section de définition des commandes
Ajoutez les lignes suivantes :
# Command to check ups daemon
define command{
command_name check_ups
command_line $USER1$/check_ups -H $HOSTADDRESS$ -u $ARG1$
}
Dans la section de définition des services
Ajoutez les lignes suivantes :
# "ups" on local machine
define service{
use lan-host-svc ; template to use
host_name voodoo.ajoute.org
service_description NET:upsd
check_command check_ups!mge_ellipse
}
Relancer Nagios
Une fois ces modifications apportées, arrêtez, puis redémarrez Nagios.
Problème connu
Attention, il y a un problème connu avec le plugin Nagios check_ups. Dans le fichier de log /var/log/daemon, on trouve l'entrée suivante à chaque test de l'onduleur :
May 11 15:07:18 myserver upsd[14568]: Host 127.0.0.1 disconnected (read failure)
Le serveur upsd(8) à la fin d'un connexion TCP attend LOGOUT\n avant la fermeture de la socket. Or, le plugin check_ups n'envoie pas de LOGOUT\n, mais ferme directement la socket. Ce problème n'est toujours pas résolu dans la version 1.4.6 du package nagios-plugins.
Liens
- Documentation locale :
- /usr/local/share/doc/nut/design.txt
- /usr/local/share/doc/nut/shutdown.txt
- Installation de
nutsur un Linux Debian :