Dupliquer une machine sous Linux en ssh (à la bourrin)

5 minutes read

Pour des besoins divers, j'ai besoin de dupliquer un grand nombre de machines. Dans le cas de ces derniers jours, je dois faire du P2V sur une plateforme d'une 50e de machine. Le P2V, c'est transformer une machine physique en machine virtuelle (pour le coup sur VMWare). La plateforme étant en production et le calendrier définissant une migration s'étalant sur un mois, je duplique tout maintenant, fait la bonne configuration et ferait juste un offset des sites web (scripts PHP, images, bases SQL) au moment de la bascule avec les DNS. Petit décryptage de comment se simplifier la vie. Le but est d'être rapide et efficace et d'avoir peut de boulot à refaire.

1 - Avant propos

Selon vos besoins et le nombre de machines certaines étapes peuvent être supprimées. Dans mon cas, on ouvrira un tunnel SSH via une machine qui sert de passerelle pour le transfert.

Dans la suite on nommera :

  • bridge : la machine qui sert pour le tunnel SSH
  • phy1 ... phy9 : les machines physiques 1 à 9
  • vm1 ... vm9 : les vm1 à vm9 qu'on aura préparé sur notre infra (VMWare, Xen, Proxmox ...) avec les bonnes spécifications matériel  (on gardera une cohérence avec les machines physiques au niveau des numéros dans la suite)
  • login : le login qu'on utilise non root qu'on utilise par défaut sur les serveurs

On suppose que notre machine perso est sur une Debian-like pour install des packages manquant. On suppose également que les configurations serveurs sont homogènes sur le parc de serveurs physiques (sinon rapprenez vos bases).

2 - Préparer sur les machines physiques (pré-configuration SSH)

Vu qu'on a une plateforme existente, on suppose qu'on a les moyens de s'y connecter facilement via une patte réseau de management (clées SSH + sudo par ex).

Sur notre machine on installera le package cssh.

$ sudo aptitude install clusterssh

Ce package permet de lancer plusieurs sessions SSH via une seule ligne de commande et d'y reproduire les mêmes commandes sur chaque session.

On se génère aussi une clé SSH (type RSA) :

$ ssh-keygen -t rsa

On met ensuite la clé .ssh/id_rsa.pub disponible en HTTP pour la plateforme physique (et pas pour la Terre entière !). Pensez à la supprimer après la duplication.

On se connecte alors à chaque machine et on y exécute les commandes suivantes.

$ cssh phy1 phy2 phy2 ...  phy9
$ sudo su -

On aura besoin de l'accès root pour le transfert, donc on se l'autorise temporairement en SSH.

# mkdir -p .ssh
# wget http://mon-serveur-perso/macle.pub -O - >> .ssh/authorized_keys

Ne cherchez ma clé publique, elle n'est pas sur le net.

Choisissez ensuite votre éditer favori (vim, nano, ed...) pour éditer le fichier /etc/ssh/sshd_config :

PermitRootLogin no
+ PermitRootLogin yes
+ AllowUsers root@bridge login@* - RSAAuthentication no
- PubkeyAuthentication no
- #AuthorizedKeysFile %h/.ssh/authorized_keys
+ RSAAuthentication yes
+ PubkeyAuthentication yes
+ AuthorizedKeysFile %h/.ssh/authorized_keys 

Si vos équipes de dev se connectent aussi en SSH, pensez à les rajouter dans les AllowUsers. On peut alors relancer le service sshd :

# /etc/init.d/ssh restart

On pense à s'assurer que le package rsync est installé.

# aptitude install rsync

On prendra le temps d'analyser la volumétrie des dossiers pour ne pas copier ce qui n'est pas vraiment nécessaire. Donc mon cas, je cherche à ne pas trop me casser la tête, donc je ne transfert pas ce qui est de type backup et aussi les montages NFS (que j'ai armonisés en les montant en sous-dossiers de /mnt/nfs).

On peut alors se délogguer de ces machines.

3 - Lancer la synchro en rsync via un tunnel SSH

Afin d'éviter de trop saturer les liens réseaux (vu que l'ancienne plateforme physique reste en production le temps du transfert), on évitera de faire trop de duplication en simultané.

On démarre donc la vm1, qui remplacera phy1 et que l'on aura préalablement bien provisionné. La machine sera démarrée sur un liveCD (personnellement, je démarre sur une ISO Gentoo). Une fois l'OS disponible, on se lance un terminal si l'on est sur l'interface graphique. Ensuite, tout se fera de la même manière, en ligne de commande. Je suppose que vous connaissez la configuration IP qui va bien pour vm1.

$ sudo ifconfig eth0 IPVM1/CIDR
$ sudo route add default gw IPGW

On partitionne le disque comme il faut. Là encore j'ai une préférence pour le vieillissant cfdisk. Ensuite formatage des partitions. Puis montage. On supposera que l'on a fait très basique avec juste un / accompagné d'un /boot et d'un swap pour le partitionnement du disque /dev/sda (ADAPTEZ !).

$ sudo mount /dev/sda3 /mnt/gentoo
$ sudo mkdir /mnt/gentoo/boot 
$ sudo mount /dev/sda1 /mnt/gentoo/boot
$ mkdir .ssh
$ echo "Host phy1" >> .ssh/config
$ echo " ProxyCommand nohup ssh bridge nc -w1 %h %p" >> .ssh/config
$ wget http://mon-serveur-perso/macle.priv -O .ssh/id_rsa

Encore une fois, inutile de chercher ma clé privée ...

On peut enfin s'occuper du transfert. Certains dossiers sont donc à éviter. A vous d'en rajouter.

$ sudo rsync -av --progress root@phy1:/* /mnt/gentoo/ --exclude="/dev/*" --exclude="/sys/*" --exclude="/proc/*" --exclude="/mnt/nfs/*/*"

Maintenant que c'est fini, occupons-nous de la configuration finale.

$ sudo mount -t proc none /mnt/gentoo/proc
$ sudo mount -t sysfs none /mnt/gentoo/sys
$ sudo cp -a /dev/* /mnt/gentoo/dev
$ sudo mount -o bind /dev /mnt/gentoo/dev
$ sudo chroot /mnt/gentoo /bin/bash

Vu qu'on a supposé être sur une Debian, on modifiera les fichiers suivant comme il va bien :

  • /etc/fstab
  • /etc/hosts
  • /etc/networks
  • /etc/network/interfaces
  • /etc/ssh/sshd_config (pour supprimer les modifications faites au point 2)
  • /etc/udev/rules.d/70-persistent-net.rules ou z25-persistent-net.rules (ou du genre, selon la version, qui est à vider de son contenu)

Je vous laisse adapter aux applications installées sur la machine. De la même manière, on purge la clé SSH rajoutée pour le transfert. Ensuite il faut mettre à jour grub.

# update-grub
# /usr/sbin/grub-install /dev/sda

Sur certaines vieilles Debian, il m'est arrivé de devoir modifier le fichier /boot/grub/menu.lst et /etc/mtab à la main avant de lancer grub-install.

Une fois fini, il vous suffit de redémarrer la VM sans l'ISO de Gentoo et voilà!

A reproduire pour chaque migration P2V.

4 - Nettoyage

Une fois les machines dupliquées (ou à chaque), on pense à faire un rollback des modifications du point 2 en supprimant la clé SSH et en remodifiant la configuration de SSH.

Updated: