Voici le tuto que j'ai publié il y a quelques minutes, puis enlevé suite à la constatation qu'il ne marche pas à tous les coups !
Il semblerait que mes tests montrent que le résultat attendu, c'est à dire l'arrêt des serveurs "esclaves" avant l'arrêt du serveur "maître" ne soit pas reproductible plus d'une fois.
Je pense qu'il y a un problème de validité de la clé publique d'une fois sur l'autre pour la connexion ssh sans mot de passe.
Il me semble que mtiburs avait rencontré ce genre de problème.
Je vais faire des recherches sur le sujet et tenter de résoudre le problème.
Si mtiburs peut m'aiguiller à ce sujet, ce n'est pas de refus.
Veuillez m'excuser pour ma publication hâtive de ce tuto qui pour l'instant ne fonctionne pas toujours.
Le sujet reste ouvert et reste à l'état de post jusqu'à la résolution du problème.
Cordialement.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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
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 !
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".
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
Il sera rendu exécutable, après création, par la commande "chmod".
Pour l'exemple, je propose simplement l'emplacement "/mnt/pool1" pour y installer le script et les traces d'exécution.
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".
Pour que le serveur 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 a réaliser, ici pour l'exemple, 1 serveur Nas4Free "esclave" en 192.168.0.21 et 1 serveur mare en 192.168.0.20 :
1 - Se connecter en ssh sur le serveur "maître" à partir d'un poste client (ssh root@192.168.0.20), ou se positionner directement en mode console sur le serveur "maître" :
On est donc en root dans le répertoire "/root"
2 - créer le script "/mnt/pool1/shutdown.sh" :
vi /mnt/pool1/shutdown.sh
... saisir les lignes du script indiqué ci-dessus avec les adresses correctes de chaque serveur "esclave" ...
sauvegarder et fermer "/mnt/pool1/shutdown.sh" sous vi.
3 - rendre le script "/mnt/pool1/shutdown.sh" exécutable :
chmod +x "/mnt/pool1/shutdown.sh"
4 - Générer les clés d'accès entre serveur maître et serveur esclave :
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".
5 - A partir de la session présente sur la machine "maître", se connecter en ssh sur la machine "esclave"
ssh root@192.168.0.21 (avec saisie du mot de passe root de la machine esclave, pour la dernière fois ...)
6 - Sur la machine "esclave" :
Créer le répertoire "/root/.ssh"
mkdir /root/.ssh
puis, se déconnecter de la machine "esclave"
exit
7 - 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".
scp /root/.ssh/id_rsa.pub 192.168.0.21:/root/.ssh/authorized_keys
8 - 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 :
ssh root@192.168.0.21
9 - sur le serveur esclave :
sauvegarder le répertoire /root/.ssh sous "/mnt/pool1" par exemple
cp -R /root/.ssh /mnt/pool1/.ssh
10 - se déconnecter du serveur esclave.
exit
11 - Sur le webgui 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.
12 - Sur le webgui du serveur "esclave" :
Dans "Système|Avancé|Scripts" de commande" positionner l'exécution de la commande suivante dans la phase de "Postinit" du serveur "esclave" :
cp -R /mnt/pool1/.ssh /root/.ssh
Dans "Système|Avancé|Scripts" de commande" positionner l'exécution de la commande suivante dans la phase de "Arrêt" du serveur "esclave" :
echo "shutdown du serveur le `date`" >> /mnt/pool1/shutdown.log
Cette dernière commande ne fait que tracer l'arrêt du serveur "esclave" dans le fichier "/mnt/pool1/shutdown.log" du serveur "escalve".
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.

