mardi 1er mars 2016 (), par
Installation du nouveau serveur, l’ancien serveur reste utilisé.
/etc/group et /etc/passwd du "vieux" serveur dans le répertoire root du nouveau, répertoire personnel de l’utilisateur root où l’on se trouve par défaut après s’être connecté en root.
scp root@IP_OLD:/etc/group group_oldscp root@IP_OLD:/etc/passwd passwd_oldToute cette procédure est justifiée par le fait que smbpasswd contient l’uid et doit être rapatrié entièrement, donc il faudra protéger les UID et privilégier les anciens (utilisateurs déclarés dans Samba).
usermod -u 502 ftptransgroupmod -g 502 transfertcp /etc/group /root/group_newcp /etc/passwd /root/passwd_new1) Groupes
cat group_old | awk -F: '{ if ($3 > 999) print $0 }' | sort -t':' -k3n -k1> fic_g_old1000cat group_new | awk -F: '{ if ($3 < 1000 ) print $0 }' | sort -t':' -k3n -k1 > fic_g_new1000mv /etc/group /etc/group_origcat fic_g_new1000 fic_g_old1000 > /etc/group2) Utilisateurs
cat passwd_old | awk -F: '{ if ($3 > 1001 ) print $0 }' | sort -t':' -n -k3 > fic_u_old1000cat passwd_new | awk -F: '{ if ($3 < 1002 ) print $0 }' | sort -t':' -n -k3 > fic_u_new1000mv /etc/passwd /etc/passwd_origcat fic_u_new1000 fic_u_old1000 > /etc/passwdil peut être utile de mettre ces commandes dans un fichier de script afin de régénérer les fichiers passwd et group en cas de changements avec nouveaux utilisateurs ou nouvelles machines reliées à Samba
Désactiver sur le nouveau serveur le démarrage automatique des services smb et nmb, pour éviter les conflits avec l’ancien serveur lors du transfert des données.
new_serv:~ # chkconfig -d smb
smb 0:off 1:off 2:off 3:off 4:off 5:off 6:off
new_serv:~ # chkconfig -d nmb
nmb 0:off 1:off 2:off 3:off 4:off 5:off 6:offRécupérer de l’ancien serveur les fichiers suivant avec la commande scp : scp root@IP_OLD:/fichier /fichier
/etc/hosts/etc/ssh/sshd-banner qu’il faudra éditer pour signaler que l’on est sur un nouveau serveur et éviter la confusion avec l’ancien/var/lib/samba/, s’assurer que les services smb/nmb sont arrêtés sur le nouveau serveur/etc/samba/,/etc/shadow/etc/HOSTNAME (si le nouveau a été mal nommé pendant masterisation)/var/spool/cron/tabs/root il faudra redémarrer le serveur cron par service crond restart/etc/ssh/sshd_config il faudra redémarrer le serveur ssh par service sshd restartavec la commande rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@IP_OLD_SERVER:/repertoire_source/ /repertoire/destination/
En raison du volume de certains répertoires, lancer les synchronisations le soir ou le week-end.
Synchroniser les données, même si cela a été fait à l’étape précédente, afin de mettre à jour.
en utilisant une commande du type rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@IP_OLD_SERVER:/repertoire_source/ /repertoire/destination/
il faudra aussi copier les répertoires et fichiers système/de configuration
/var/lib/samba, s’assurer que les services smb/nmb sont arrêtés sur le nouveau serveur/etc/samba,/etc/shadow/etc/HOSTNAME (si le nouveau a été mal nommé pendant masterisation)/var/spool/cron/tabs/root il faudra redémarrer le serveur ssh par service sshd restart/etc/ssh/sshd_config/etc/ssh/sshd-banneren utilisant la commande scp de la manière suivante : scp -r root@IP_OLD:/chemin/repertoire /chemin/, sans le "/" final pour le chemin source cette fois.
par exemple : scp -r root@10.233.185.93:/etc/samba /etc/ (répertoire )ou scp -r root@10.233.185.93:/var/spool/cron/tabs/root /var/spool/cron/tabs/ (fichier)
:attention à titre expérimental :attention Pour automatiser les synchronisations, voir onglet précédent, et relancer le même script.
Si l’authentification par clé fonctionne pour les synchronisations par rsync, alors il en sera de même pour les scp.
les utilisateurs n’auront plus accès au serveur à cet instant
:attention Prévenir ou faire prévenir les utilisateurs :attention
smb et nmb sur l’ancien serveur
service smb stopservice nmb stopsmb, nmb, sur le nouveau serveur
chkconfig -a nom_service (smb/nmb)les utilisateurs accèdent désormais au nouveau serveur
service nom_service status/rootNe pas oublier de mettre à jour la documentation de site.
Et l’explication détaillée :
#!/bin/bash
IP_OLD=""; # adresse IP de l'ancien serveur, sur lequel on se connecte pour récupérer les données. Permet de réutiliser le script en ne changeant que cette variable.
reponse="z";until [ $reponse == "y" -o $reponse == "n" ] ; do echo "Afficher à l'écran (en plus du fichier journal) le détail des fichiers téléchargés ? y/n"; read reponse ; done;nblignes=$(cat liste_synchros | grep -vE "^$" | wc -l);
cat-v) les lignes vides avec grep.
-E) signifie : ^ début de ligne $ fin de ligne, donc ligne ne contenant rien entre les deux, donc videecho "Il y a $nblignes dossiers à copier" | tee -a synchros.log;
tee fait un affichage à l’écran + envoi dans un fichier,
-a ajoute à la fin du fichier au lieu de l’écrasertabtaille[0]=$nblignes;tabtailleh[0]=$nblignes;totalk=0;compteur=1;
echo "On détermine la taille des fichiers et dossiers à télécharger, cela peut prendre un peu de temps." | tee -a synchros.log
teefor ligne in <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+Y2F0IGxpc3RlX3N5bmNocm9zPC9jb2RlPg=="></span> ;
liste_synchros do
echo -n "$ligne" | tee -a synchros.log;
tee taillek=$(ssh root@$IP_OLD du -s $ligne 2>/dev/null | grep "$ligne" | awk '{ print $1 }');
du (disk usage, ne pas confondre avec df, disk free) sur l’ancien serveur, actuellement en production, à distance par SSH.
-s signifie que l’on veut le summary, autrement dit le résumé pour le dossier, sa taille globale, et non le détail de chaque fichier.-h afficherait le résultat dans une forme lisible par un humain : en Ko, Mo, Go...2>/dev/null renvoie les messages de la sortie standard n°2, réservée aux messages d’erreurs, et en l’occurrence à la bannière SSH, vers le vide.grep qui suit ne retiendra que la ligne contenant le nom du dossier dont l’on souhaite déterminer la tailleawk final ne gardera que le premier champ - le séparateur par défaut étant l’espace - qui contient la taille du dossier. totalk=$(expr $totalk + $taillek);
tabtaille[$compteur]=$taillek;
if [ $taillek -gt 1024 ] then taillem=$(expr $taillek / 1024); if [ $taillem -gt 1024 ] then tailleg=$(expr $taillem / 1024); restm=$(expr $tailleg \* 1024); taillem=$(expr $taillem - $restm); tabtailleh[$compteur]="$tailleg Go et $taillem Mo"; else tabtailleh[$compteur]="$taillem Mo"; fi else tabtailleh[$compteur]="$taillek Ko"; fi
echo " : ${tabtailleh[$compteur]}" | tee -a synchros.log;
compteur=$(expr $compteur + 1);
done;
if [ $totalk -gt 1024 ]then totalm=$(expr $totalk / 1024); if [ $totalm -gt 1024 ] then totalg=$(expr $totalm / 1024); if [ $totalg -gt 1024 ] then totalt=$(expr $totalg /1024); totalh="$totalt To"; else totalh="$totalg Go"; fi else totalh="$totalm Mo"; fielse totalh="$totalk Ko";fi echo "Total : $totalh" | tee -a synchros.log;
compteur=1;
tailledlk=0;
for ligne in <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+Y2F0IGxpc3RlX3N5bmNocm9zPC9jb2RlPg=="></span> ;
liste_synchros do
if [ $tailledlk -gt 1024 ] then tailledlm=$(expr $tailledlk / 1024); if [ $tailledlm -gt 1024 ] then tailledlg=$(expr $tailledlm / 1024); tailledlh="$tailledlg Go"; else tailledlh="$tailledlm Mo"; fi else tailledlh="$tailledlk Ko"; fi
taillelocale=$(du -sh $ligne | awk '{ print $1 }');
du mais cette fois en local et avec les deux options s et h echo "====== synchronisation de $ligne - $compteur/$nblignes - ${tabtailleh[$compteur]} à télécharger, $taillelocale sur disque ======" | tee -a synchros.log; echo "Téléchargé jusqu'à maintenant : $tailledlh sur $totalh" | tee -a synchros.log;
dispo=$(df $ligne | tail -n 1 | awk '{ print $3 }');
df (disk free)
tail -n 1 enlève la ligne de titre pour ne garder que la dernière ligneawk affiche le troisième champ à savoir le nombre de Ko libres. echo "Il reste $dispo Ko, il faut ${tabtaille[$compteur]} Ko"; if [ $dispo -gt ${tabtaille[$compteur]} ]
then
echo "Il y a assez de place sur la destination"; if [ $reponse == "y" ]
then rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@$IP_OLD:$ligne $ligne 2>&1 | tee -a synchros.log; else
rsync --numeric-ids -avz --rsh="ssh -c arcfour" root@$IP_OLD:$ligne $ligne 2>&1 1>>synchros.log; fi
else echo "Il n'y a pas assez de place sur la destination"; fi
tailledlk=$(expr ${tabtaille[$compteur]} + $tailledlk); compteur=$(expr $compteur + 1);
expr et on fait de même pour la taille téléchargée. done;
echo "====== fin du script le $(date) ======" | tee -a synchros.log;
tee