Déployer des machines virtuelles avec les xen-tools

 

A partir du moment ou on prend gout à Xen, on en arrive rapidement à déployer sans arrêt des vms, pour faire des machines de prod, des machines de test, de dev, etc ... Il est donc important pour ne pas perdre de temps sur des choses récurrentes d'avoir des bons outils pour déployer ces machines virtuelles. J'utilise (entre autre) les xen-tools, c'est un ensemble de scripts Perl développés par Steve Kemp qui permettent d'installer facilement et rapidement des machines virtuelles Xen.

Mise en place

Installation

Sur une Debian/Lenny, il existe deux versions du paquet, la version 3.9 disponible dans les dépôts standards Lenny et la version 4.1 dans les backports lenny. J'ai eu l'occasion d'avoir des problèmes avec la version 3.9, je vous conseille donc la version 4.1 sur laquelle sont basés tout mes exemples qui vont suivre. Il faut donc rajouter les dépôts backports lenny dans les sources.list :

deb http://www.backports.org/debian lenny-backports main contrib non-free
deb-src http://www.backports.org/debian lenny-backports main contrib non-free

Il faut aussi récupérer la clé gpg du dépôt pour être certain de l'intégrité de nos paquets :

# wget -O - http://backports.org/debian/archive.key | apt-key add -

Et mettre à jour la liste des paquets disponibles pour notre système :

# apt-get update

Puis on installe la version du dépôt lenny backports en précisant la version du paquet sinon on va installer la version disponible dans les dépôts officiels :

# apt-get install -s xen-tools version=4.1-1~bpo50+1

Configuration

On a deux façon de créer une machine virtuelle :

  1. de préciser toutes les options sur la ligne de commande xen-create-image ;
  2. créer des fichiers de configuration

Ma philosophie est d'en taper le moins possible au clavier. Le fichier de configuration de base est le fichier /etc/xen-tools/xen-tools.conf. En voici un exemple :

lvm = vgvm

install-method = debootstrap

size   = 10Gb
memory = 512
maxmem = 1024
swap   = 1024Mb
vcpus  = 2
fs     = ext3
dist   = lenny
image  = sparse

gateway   = 192.168.1.254
netmask   = 255.255.255.0
bridge    = eth0

passwd = 0

kernel      = /boot/vmlinuz-2.6.26-1-xen-686
initrd      = /boot/initrd.img-2.6.26-1-xen-686
modules     = /lib/modules/2.6.26-1-xen-686

arch=i386

mirror = http://192.168.1.202/debian/

ext3_options   = noatime,nodiratime,errors=remount-ro

serial_device = hvc0
disk_device = xvda

output    = /etc/xen/guidtz
extension = .cfg

Détaillons les options de ce fichier :

  • lvm = vgvm : on définit le backend utilisé, ici du lvm, tous les disques des vms xen seront des partitions logiques lvm ;
  • install-method = debootstrap : méthode d'installation, debootstrap par défaut pour les vms debian/ubuntu ;
  • size / memory / maxmem / swap : définition des tailles des disques et de la mémoire. A noter que maxmem n'est pas standard, je l'ai rajouté c'est pour cela que j'ai pas de Mb à la fin ;
  • vcpus : comme pour maxmem pas standard mais me permet de générer automatiquement mon fichier de configuration, définit le nombre de vcpus de la vm ;
  • fs : le type de filesystem ;
  • dist : la version de debian ;
  • gateway / netmask / bridge : paramètres pour le réseau, idem bridge n'est pas standard, ne concerne que des installations sur une configuration réseau en bridge et si il y a plusieurs cartes réseau, sinon c'est pas utile ;
  • kernel / initrd / modules : configuration du noyau pour la vm, si on utilise pas pygrub ;
  • password : si à 0 le script ne demande pas de mot de passe root, si 1 le script demande un mot de passe ;
  • arch : l'architecture de la vm ;
  • mirror : le miroir du dépôt ;
  • serial_device / disk_device : la définition des devices pour la console et pour les disques ;
  • output / extension : l'endroit ou sont créés les fichiers de configuration des vms et leur extension ;

Je dérive ce fichier par distribution et architecture, je me retrouve donc avec une série de fichiers que je nomme : xen-tools_lenny_i386.conf xen-tools_jaunty_i386.conf ...

Template de création du fichier .cfg

Le fichier /etc/xen-tools/xm.tmpl est un template qui va permettre de créer le fichier de démarrage de la vm. J'ai légèrement modifié le mien pour intégrer les paramètres supplémentaires que j'ai ajouté au dessus (maxmem, vcpus, bridge). Je rajoute les blocs de code suivant :

ligne 26 à 29 :
26 maxmem      = '{$maxmem}'
 27
 28 # VCPUS
 29 vcpus       = '{$vcpus}'
ligne 122 à 125 :
my $br = '';
122     if ( $bridge )
123     {
124       $br = ",bridge=$bridge";
125     }
ligne 130 :
130     $OUT .= "$br";
ligne 142, 143 :
142 # For clock problems
143 extra="clocksource=jiffies"

Les rôles

Si on en reste à une configuration de base le système déployé est un système de base, après on en arrive toujours à installer un certain nombre de paquets et configurer certains fichiers. On va utiliser les rôles pour définir des procédures post installation.

Créer un rôle

On va créer un rôle minimal, les rôles se trouvent dans le répertoire /etc/xen-tools/role.d, j'ai repris le rôle minimal de base et rajouté quelques petites choses :

prefix=$1
if [ -e /usr/lib/xen-tools/common.sh ]; then
 . /usr/lib/xen-tools/common.sh
else
 echo "Installation problem"
fi
chroot ${prefix} /usr/bin/apt-get update
installDebianPackage ${prefix} udev
installDebianPackage ${prefix} screen
installDebianPackage ${prefix} vim
installDebianPackage ${prefix} openssh-server
installDebianPackage ${prefix} postfix
installDebianPackage ${prefix} mailx
installDebianPackage ${prefix} ntp
installDebianPackage ${prefix} bzip2
installDebianPackage ${prefix} yafc
installDebianPackage ${prefix} tree
installDebianPackage ${prefix} nmap
#
# Create sysadmin user
#
chroot ${prefix} useradd -u 666 -s /bin/bash -m -p '$6$.....' sysadmin
#
# Copy rsa key
#
mkdir -m 700 ${prefix}/root/.ssh
cat /etc/xen-tools/keys/id_rsa_guillaume.pub 
 | tee -a ${prefix}/root/.ssh/authorized_keys2
chroot ${prefix} chown -R root:root /root/.ssh
#
# Copy skel
#
cp -a /etc/xen-tools/skel/minimal/* ${prefix}

#
# Configuration postfix
#
# TODO : modifier main.cf mailname et postaliases
/bin/sed -i 's/minimal/'${hostname}'/g' ${prefix}/etc/postfix/main.cf
/bin/sed -i 's/minimal/'${hostname}'/g' ${prefix}/etc/mailname
/bin/sed -i 's/ip/'${ip}'/g' ${prefix}/etc/posfix/main.cf
sed -i -e '/^root:/d' ${prefix}/etc/aliases
echo "root: sysadmin@cheramy.name" | tee -a ${prefix}/etc/aliases
chroot ${prefix} /usr/sbin/postalias

#
# Upgrade packages
#
chroot ${prefix} /usr/bin/apt-get update
chroot ${prefix} /usr/bin/apt-get upgrade -y
chroot ${prefix} /usr/bin/apt-get clean
#
# Modif de /etc/hosts
#
/bin/sed -i 's/minimal/'${hostname}'/g' ${prefix}/etc/hosts
#
# Change root password
#
chroot ${prefix} /usr/sbin/usermod -p '$6$....' root

Sans entrer dans les détails :

  • on installe une série de paquets :  installDebianPackage ;
  • on crée un user sysadmin et à la fin on modifie le mot de passe root avec l'encodage du mot de passe en SHA-512 (mkpasswd -m SHA-512 azerty) ;
  • on copie une clé publique ssh que je met à disposition dans un répertoire /etc/xen-tools/keys ;
  • on copie un ensemble de fichiers disponibles dans le répertoire /etc/xen-tools/skel/minimal, dans ce répertoire on peut mettre une copie de tout les fichiers que l'on veut voir dans nos vms ;
  • un peu de configuration de postfix ;
  • mise à jour des paquets et des dépôts ;
  • on modifie le fichier /etc/hosts (celui que j'ai mis dans le skelette) ;

Enchainer les rôles

Il est possible de mettre en place des rôles qui vont faire appel à d'autres rôles. Par exemple je veux pouvoir installer shorewall sur certaines machines virtuelles, je crée donc un rôle shorewall-one, pour une configuration de shorewall avec une seule interface. Mais dans l'installation d'une machine de rôle shorewall-one, j'installe aussi ce que j'installe dale rôle minimal, on va donc dire au début du rôle shorewall-one, d'exécuter le rôle minimal :

#
# Execute minimal install before
#
. /etc/xen-tools/role.d/minimal

Partitionnement

Par défaut, l'installation va créer un partitionnement simple, une partition de swap et une partition /. Cela peut être assez limité si on veut créer plusieurs partitions pour découper le système de fichier de notre arborescence. On va donc créer un fichier qui va définir notre partitionnement, ce fichier ce trouve dans le répertoire /etc/xen-tools/partitions.d, je crée le fichier server-base :

[root]
size=3G
type=ext3
mountpoint=/
options=sync,errors=remount-ro
[swap]
size=2G
type=swap
[tmp]
size=1G
type=ext3
mountpoint=/tmp
[usr]
size=4G
type=ext3
mountpoint=/usr
[var]
size=2G
type=ext3
mountpoint=/var

Créer une machine virtuelle

Une fois que nous avons tout ces fichiers de configuration, on va pouvoir créer notre machine virtuelle :

# xen-create-image --hostname=naruto --config=/etc/xen-tools/xen-tools_lenny_i386.conf
 --ip=192.168.1.203 --role=minimal  --partitions=server-base --force

Et voilà une jolie vm, configurée et prête à démarrer.