On part du principe que cet UPS sait avertir un serveur de la fin iminnente de sa fourniture en énergie électrique suite à une coupure de courant et donc à la décharge de ses batteries au bout d'un certain temps, via un câble série ou USB.
Le service UPS est donc à activer sur le serveur Nas4Free relié à l'UPS, ce dernier étant appelé par la suite de ce tuto le serveur "maître".
Si vous avez besoin d'aide, merci de poster sur le [Topic unique] Piloter l'arrêt de plusieurs Nas4Free sur UPS
Attention : ce tuto met en oeuvre une liaison ssh sous le login "root" sans mot de passe.
C'est contraire aux règles élémentaires en matière de "SSI" (Sécurité des Systèmes d'Information") car cela constitue une faille qui peut être exploitée par des personnes malintentionnées à votre détriment. Je décline toute responsabilité sur les risques et leurs conséquences de cette solution. Vous pouvez trouver sur internet une multitude d'explications sur les dangers de l'établissement d'une liaison ssh root entre PC sans mot de passe.
Testé dans les conditions suivantes :
serveur "maître" : NAS4Free 9.2.0.1 - Shigawire (revision 972) x64-embedded
111909 RSDT1411 AMD Athlon(tm) 64 Processor 4000+ 4096MiB RAM - HDD = 2 x 4 To in ZFS mirroring + 2 x (2 x 2To in ZFS mirroring).
serveur esclave : NAS4Free 9.2.0.1 - Shigawire (revision 972) x86-embedded sur Intel(R) Pentium(R) 4 CPU 2.40GHz - Hewlett-Packard 0840 - BIOS Phoenix Technologies Ltd. version: JP.W1.06US 06/30/04 - ZFS 4 x 80Go en Raid1 + 1 x 80 Go en spare.
Batterie/Onduleur : UPS EATON Ellipse MAX 1100
Tout d'abord voici ma configuration du service UPS :
- Identifiant : ups
- Pilote : usbhid-ups
- Port : auto
- Description : EATON Ellipse Max 1100 USBS FR
- Mode d'arrêt : Batterie faible sur le système UPS
- Destinataire de l'email : mon adresse email
- Sujet : UPS notification from %h le %d !
Soit un serveur "maître" en 192.168.0.20 et un serveur "esclave" en 192.168.0.21
Ce qui sera fait sur le serveur "esclave" peut être fait de la même façon sur d'autres serveurs "esclaves" si on possède plus de 2 serveurs.
Le principe est qu'un serveur parmi l'ensemble des serveurs soit le "maître" et les autres les serveurs "esclaves".
Tous les serveurs ("maître" et "esclaves") sont électriquement branchés sur l'UPS.
Le serveur "maître" est en plus branché sur l'UPS via un câble USB ou série RS232, contrairement aux serveurs "esclaves".
Le serveur "maître" est configuré via le service UPS pour s'arrêter lorsque la batterie de l'UPS est presque déchargée et ne peut plus fournir l'énergie à l'ensemble des serveurs Nas4Free.
Le principe est d'installer sur le serveur "maître" un script shell qui va arrêter dans sa phase d'arrêt les serveurs "esclaves" via la commande "shutdown" activée sur chaque serveur "esclave" en ssh.
Pour cela, il faut le script shell suivant à un emplacement du serveur "maître".
Ce script peut être créé avec l'éditeur de texte vi en étant connecté en ssh sur le serveur "maître".
Il sera rendu exécutable, après création, par la commande "chmod".
D'autre part, les répertoires "/root/.ssh" sur chacun des serveurs "maître" et "esclaves" doivent être sauvegardés une première fois après génération des clés publiques et privées pour pouvoir être restaurés au re-démarrage de chacun des serveurs.
Cette restauration se fera à l'aide d'un script "init_ssh.sh".
Pour l'exemple, je propose simplement l'emplacement "/mnt/pool1" pour y installer le script et les traces d'exécution ainsi que les répertoires "/mnt/pool1/root/.ssh" pour les sauvegardes des clés.
Lorsque le serveur "maître" va s'arrêter, il exécutera avant arrêt le script "/mnt/pool1/shutdown.sh" en tracant dans le log "/mnt/pool1/shutdown.log" les actions réalisées.
Dans ce script "/mnt/pool1/shutdown.sh" nous activons l'arrêt de chaque serveur "esclave" via ssh avec la commande "shutdown".
Au redémarrage de chaque serveur, les scripts shell "/mnt/pool1/init_ssh.sh" restaureront les clés publiques et privées.
Pour que le serveur "maître" puisse accéder aux serveurs "esclaves" en ssh, il faut l'autoriser à y accéder sans que le mot de passe "root" n'ai besoin d'être saisi.
Pour cela il faut configurer sur chaque serveur "esclave" une clé publique préalablement créée.
Voici donc la manip à réaliser, ici pour l'exemple, 1 serveur Nas4Free "esclave" en 192.168.0.21 et 1 serveur "maître" en 192.168.0.20 :
Etapes
1 - Se connecter en ssh sur le serveur "maître" à partir d'un poste client :
Code: Select all
ssh root@192.168.0.202 - créer le script "/mnt/pool1/shutdown.sh" :
Code: Select all
vi /mnt/pool1/shutdown.shsauvegarder et fermer "/mnt/pool1/shutdown.sh" sous vi.
Code: Select all
#!/bin/sh
# Ajouter 1 ligne supplémentaire par serveur Nas4Free "esclave" avec leur adresse correctement renseignée
# ssh root@192.168.xx.xx "/sbin/shutdown -h now" >> /mnt/pool1/shutdown.log
ssh root@192.168.0.21 "/sbin/shutdown -h now" >> /mnt/pool1/shutdown.log
echo -e "shutdown du serveur le `date`\n----------\n" >> /mnt/pool1/shutdown.log
Code: Select all
chmod +x "/mnt/pool1/shutdown.sh"Code: Select all
vi /mnt/pool1/init_ssh.sh(remarque : il faut positionner les droits "/root/.ssh" à 700, sinon, cela ne fonctionne pas (merci à laster13 et mtiburs pour l'info !))
Code: Select all
#!/bin/sh
mkdir /root/.ssh
chmod 700 /root/.ssh
cp /mnt/pool1/root/.ssh/* /root/.sshCode: Select all
chmod +x /mnt/pool1/init_ssh.shCode: Select all
ssh-keygen -t rsaCette commande génère une clé publique et une clé privée (dans l'ordre, id_rsa.pub et id_rsa) dans le dossier "/root/.ssh" du serveur "maître".
6 - Sauvegarder sur une partition de donnée autre que celle du disque système du serveur "maître" le répertoire "/root/.ssh" et son contenu :
Code: Select all
mkdir -p /mnt/pool1/root/.ssh
cp /root/.ssh/* /mnt/pool1/root/.sshCode: Select all
ssh root@192.168.0.218 - Sur la machine "esclave" :
Créer le répertoire "/root/.ssh" avec les droits 700, puis se déconnecter du serveur "esclave" :
Code: Select all
mkdir /root/.ssh
chmod 700 /root/.ssh
exitil faut copier la clé publique (id_rsa.pub) dans un fichier "authorized_keys" dans le dossier "/root/.ssh" de la machine "esclave".
Code: Select all
scp /root/.ssh/id_rsa.pub 192.168.0.21:/root/.ssh/authorized_keysCode: Select all
ssh root@192.168.0.21Code: Select all
mkdir -p /mnt/pool1/root/.ssh
cp -R /root/.ssh/* /mnt/pool1/root/.sshCode: Select all
vi /mnt/pool1/init_ssh.sh(remarque : il faut positionner les droits "/root/.ssh" à 700, sinon, cela ne fonctionne pas (merci à laster13 et mtiburs pour l'info !))
Code: Select all
#!/bin/sh
mkdir /root/.ssh
chmod 700 /root/.ssh
cp /mnt/pool1/root/.ssh/* /root/.sshCode: Select all
chmod +x /mnt/pool1/init_ssh.sh
exitDans "Système|Avancé|Scripts" de commande" positionner l'exécution du script "/mnt/pool1/init_ssh.sh" dans la phase de "Postinit" du serveur "maître".
Dans "Système|Avancé|Scripts" de commande" positionner l'exécution du script "/mnt/pool1/shutdown.sh" dans la phase d'"Arrêt" du serveur "maître".
14 - Sur le webgui du serveur "esclave" :
Dans "Système|Avancé|Scripts" de commande" positionner l'exécution du script "/mnt/pool1/init_ssh.sh" dans la phase de "Postinit" du serveur "esclave" :
Dans "Système|Avancé|Scripts" de commande" positionner l'exécution de la commande "echo "shutdown du serveur le `date`" >> /mnt/pool1/shutdown.log" dans la phase d'"Arrêt" du serveur "esclave".
Cette dernière commande ne fait que tracer l'arrêt du serveur "esclave" dans le fichier "/mnt/pool1/shutdown.log"..
Le test peut se faire en arrêtant le serveur "maître" via le webgui par exemple, normalement le(s) serveur(s) "esclave(s)" doivent s'arrêter avant le serveur "maître".
Merci à Benjamin SECLIER pour son blog et son aide sur la connexion ssh sans mot de passe.
