Quand on commence à savoir créer des VM avec XEN, on souhaite que ceci aille le plus vite possible. Dans le cadre de mes activités de formation, je dois pour un TP cluster déployer 5 VM sur un serveur CentOS 5.8. L'objectif de ce billet est de présenter un script faisant tout seul le travail et en profiter pour faire autre chose.

Principe

Pour que la méthode soit efficace, le mieux est de disposer d'un mirroir de la distribution ou encore de monter l'image du DVD. Dans cet exemple je vais supposer qu'il existe sur le réseau un mirroir de la distribution. Mettre en place un mirroir CentOS est simple, c'est juste long la première fois en téléchargement Voir le billet suivant.

Les VM seront créées en 5.8 et 32 bits. Le mirroir CentOS sera donc accessible sur le réseau par l'URL suivante : http://192.168.1.100/centos/5/os/i386

Un second serveur apache sera monté sur la machine supportant les VM afin de mettre à disposition les fichiers kickstart qui permettent l'installation automatique de CentOS. Le serveur des VM, donc supportant le Dom0 portera l'adresse IP : 192.168.1.101 et portera le nom de srv1.formation.fr

Installer un serveur apache sur CentOS est simple :

yum -y install httpd
service httpd start
chkconfig httpd on

A faire sur le serveur supportant les VM Les 5 VM porterons des IP suivantes :

  • vm01 : 192.168.1.201
  • vm02 : 192.168.1.202
  • vm03 : 192.168.1.203
  • vm04 : 192.168.1.204
  • vm05 : 192.168.1.205

La commande virt-install sera utilisée, une des options de cette commande permet de donner l'emplacement d'un fichier kickstart. L'essentiel du script est donc la création de ce kickstart puis l'appel de la commande virt-install pour créer la VM.

La mise au point d'un kickstart est simple, certains font une instalaltion manulle de CentOS avec la configuration ad hoc et utilise le fichier /root/anaconda-ks.cfg qui est généré lors de l'installation comme base de travail.

Chaque VM sera créée avec 2 disques durs de 10Go, 1 carte réseau et 256Mo de RAM. Le premier disque dur sera partitionné, le second sera laissé vierge pour un usage futur.

Le script accepte 2 paramètres :

  • L'adresse IP
  • Le nom DNS ou fqdn, la première partie de ce nom sera attribué au nom d'hôte ( hostname ).

Il est possible de définir les IP codées en dur via des variables et aussi de faire des tests sur des paramètres.

Le script createVM.sh

#!/bin/sh

IP=$1
NOM_DNS=$2
VM=$(echo $(echo $NOM_DNS | cut -d '.' -f1))


echo "La VM portera le nom : $VM et aura pour nom DNS : $NOM_DNS et pour IP : $IP"

# On supprime ici toute configuration antérieure de la VM
rm -f /etc/xen/$VM

# On génère ainsi un kickstart personnalisé pour la VM
# L'adaptation est simple, il suffit de remplacer les IP par les valeurs que l'on souhaite.
cat <<EOF > /var/www/html/${VM}-ks.cfg

install
url --url http://192.168.1.100/centos/5/os/i386
lang fr_FR.UTF-8
keyboard fr-latin9
text

# nameserver donne l'IP du DNS, ici celui de Orange.
network --device eth0 --bootproto static --ip $IP  --netmask 255.255.255.0 --gateway 192.168.1.1 --nameserver 80.10.246.2 --hostname $VM

# Le mot de passe du root est azerty.
rootpw azerty

firewall --disabled
authconfig --enableshadow --enablemd5
selinux --disabled
timezone --utc Europe/Paris
# Le bootloader sera sur le premier disue dur
bootloader --location=mbr --driveorder=xvda
# En fin d'installation la machine est rebootée.
reboot
#Toute partition présente éventuellment est supprimée sur les deux disques durs ( xvda et xvdb )
clearpart --all --initlabel --drives=xvda,xvdb
part /boot --fstype ext2 --size=100 --asprimary --ondisk=xvda
part / --fstype ext3 --size=500 --asprimary --ondisk=xvda
part swap --size=512 --asprimary --ondisk=xvda
part /usr --fstype ext3 --size=2000 --ondisk=xvda
part /var --fstype ext3 --size=1000 --ondisk=xvda
part /tmp --fstype ext3 --size=500 --ondisk=xvda
part /home --fstype ext3 --size=1 --grow --ondisk=xvda
# Liste des package à installer, les deux lignes suivantes installe le minimum.
%packages --excludedocs --nobase
@core
# Ici il est possible de mettre tout ce que l'on souhaite installer en plus, a titre personnel j'installe en plus vim, wget et le protocole ntp
vim-enhanced
wget
ntp

# A partir d'ici il est possible de définir autant de scripts que l'on souhaite pour affiner la configuration
%post
# Dans un premier temps, dire aux VM que le dépôt est local
echo "[local]" > /etc/yum.repos.d/CentOS-Base.repo
echo "name=local" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/os/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
echo " " >> /etc/yum.repos.d/CentOS-Base.repo
echo "[local-updates]" >> /etc/yum.repos.d/CentOS-Base.repo
echo "name=local-updates" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/updates/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
echo " " >> /etc/yum.repos.d/CentOS-Base.repo
echo "[local-extras]" >> /etc/yum.repos.d/CentOS-Base.repo
echo "name=local-extras" >> /etc/yum.repos.d/CentOS-Base.repo
echo "baseurl=http://192.168.3.100/centos/5/extras/i386" >> /etc/yum.repos.d/CentOS-Base.repo
echo "enabled=1" >> /etc/yum.repos.d/CentOS-Base.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/CentOS-Base.repo
# Les mises à jour sont appliquées de suite
yum -y update

# Par défaut les démons iscsi sont actifs, les désactiver sauf besoin bien sur.
chkconfig --del iscsi
chkconfig --del iscsid

# Configuration de la synchro horaire
chkconfig ntpd on
ntpdate fr.pool.ntp.org
service ntpd start

# La sécurité SELINUX ne résoud que les problèmes qu'elle génère ( opinion personnelle ), surtout sur une VM donc disabled.
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

# Change le nom fqdn en nom d'hôte
sed -i 's/${NOM_DNS}/${VM}/g' /etc/sysconfig/network

# Création propre d'un /etc/hosts
echo "127.0.0.7 localhost" > /etc/hosts
echo '$IP $NOM_DNS $VM' >> /etc/hosts
%end
EOF
# A ce stade le fichier kickstart est disponible sous le répertoire /var/www/html et porte un nom type vm01-ks.cfg

# La commande virt-install complète
virt-install --name $VM -p -r 256 --disk path=/home/disks/${VM}1.img,size=10,sparse=false --disk path=/home/disks/${VM}2.img,size=10,sparse=false --location http://192.168.3.100/centos/5/os/i386 -x "cmdline ks=http://192.168.3.11/${VM}-ks.cfg ip=$IP netmask=255.255.255.0 gateway=192.168.3.1 dns=80.10.246.2 hostname=${VM}" --noautoconsole

L'option sparse=false de --disk permet de créé de suite le fichier, c'est ( vraiment ) plus long mais plus efficace après.

Rendre le script executable

chmod u+x createVM.sh

Pour créer 5 VM il suffit d'une boucle qui peut faire l'objet d'un script aussi, par exemple vm.sh

#!/bin/sh
for i in $(seq 1 5)
do
  /root/createVM.sh 192.168.1.20${i} vm0${i}.srv1.formation.fr
done

Le rendre exécutable et lancer la création des 5 VM

chmod u+x vm.sh
/root/vm.sh

Et ensuite ? C'est de l'utilisation de XEN simplement, donc une autre histoire...