This is the old XigmaNAS forum in read only mode,
it will taken offline by the end of march 2021!



I like to aks Users and Admins to rewrite/take over important post from here into the new fresh main forum!
Its not possible for us to export from here and import it to the main forum!

[TUTO] Piloter l'arrêt de plusieurs Nas4Free sur UPS - V1

Moderators: velivole18, ernie, mtiburs

Locked
User avatar
velivole18
Forum Moderator
Forum Moderator
Posts: 647
Joined: 14 Jul 2012 20:23
Location: France
Status: Offline

[TUTO] Piloter l'arrêt de plusieurs Nas4Free sur UPS - V1

Post by velivole18 »

Voici la solution pour arrêter proprement un ensemble de serveurs Nas4Free tous connectés sur le même système de "batterie/onduleur" UPS.
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.
:oops:


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 !
Principe

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.20
On est donc en root dans le répertoire "/root" du serveur "maître".

2 - créer le script "/mnt/pool1/shutdown.sh" :

Code: Select all

vi /mnt/pool1/shutdown.sh
... saisir les lignes du script indiqué ci-dessous avec les adresses correctes de chaque serveur "esclave" ...
sauvegarder 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
3 - rendre le script "/mnt/pool1/shutdown.sh" exécutable :

Code: Select all

chmod +x "/mnt/pool1/shutdown.sh"
4 - Créer le script "/mnt/pool1/init_ssh.sh" :

Code: Select all

vi /mnt/pool1/init_ssh.sh
... saisir les lignes du script indiqué ci-dessous ...
(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/.ssh
sauvegarder et fermer "/mnt/pool1/init_ssh.sh" sous vi et le rendre exécutable :

Code: Select all

chmod +x /mnt/pool1/init_ssh.sh
5 - Générer les clés d'accès entre serveur "maître" et serveur "esclave" :

Code: Select all

ssh-keygen -t rsa
puis 3 fois Entrée
Cette 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/.ssh
7 - A partir de la session ssh présente sur la machine "maître", se connecter en ssh sur la machine "esclave" :

Code: Select all

ssh root@192.168.0.21
(avec saisie du mot de passe root de la machine esclave, pour la dernière fois ...)

8 - 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
exit
9 - de nouveau sur la machine "maître" :
il 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_keys
10- se re-connecter sur le serveur "esclave" et dans le même temps vérifier que la connexion ne demande plus de mot de passe :

Code: Select all

ssh root@192.168.0.21
11 - sur le serveur "esclave", sauvegarder le répertoire "/root/.ssh" sous "/mnt/pool1" par exemple :

Code: Select all

mkdir -p /mnt/pool1/root/.ssh
cp -R /root/.ssh/* /mnt/pool1/root/.ssh
12 - Créer le script "/mnt/pool1/init_ssh.sh" :

Code: Select all

vi /mnt/pool1/init_ssh.sh
... saisir les lignes du script indiqué ci-dessous ...
(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/.ssh
sauvegarder et fermer "/mnt/pool1/init_ssh.sh" sous vi et le rendre exécutable, puis se déconnecter du serveur "esclave" :

Code: Select all

chmod +x /mnt/pool1/init_ssh.sh
exit
13 - Sur le webgui du serveur "maître" :
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 "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.
11.2.0.4 - Omnius (revision 6026) x64-embedded
111909 RSDT1411 AMD Athlon(tm) 64 Processor 4000+ 4096MiB RAM - HDD 2 x 6 To in ZFS mirroring + 2 x (2 x 4To in ZFS mirroring) - SSD 32Go - UPS EATON Ellipse MAX 1100.

Locked

Return to “Tuto”