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 (15 par défaut) avant que upsd(8) considère que le driver ne répond plus,
  • STATEPATH : définit l'emplacement de la socket du driver (/var/db/nut par 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),
  • username et password : définis dans le fichier /etc/nut/upsd.users,
  • type : prend la valeur master si l'onduleur est géré par la machine locale, sinon, la valeur slave.

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
 
doc/openbsd/nut.txt · Dernière modification: 2009/12/23 22:36 (édition externe)     Haut de page