Problématique
On n’a pas tous la chance de travailler dans une société qui déploie applications serverless sur un cluster Kubernetes hébergé dans le cloud… Mais pour beaucoup de sociétés et de cas d’utilisations, de bonnes vieilles machines virtuelles suffisent amplement à couvrir les besoins.
Le sujet auquel nous allons nous ateler est donc de créer un template VSphere pour simplifier le déploiement de machines virtuelles. Normalement, ça ne devrait pas être un problème : lorsqu’on a créé un template de VM sur VSphere, on peut le configurer lorsqu’on le déploie.
Mais voilà… pour ça, il faut que le système d’exploitation soit supporté par la version de VSphere qu’on utilise. Or, Ubuntu (Server) 20.04 n’est supporté qu’à partir de vCenter 6.7U3g (avril 2020). Si on n’a un serveur VSphere à jour, ça va donc moins marcher… et on n’a pas toujours la main sur le serveur.
Avant d’aller plus loin, je précise que je ne suis pas du tout un spécialiste de l’administration système. Le contournement que je propose ci-après n’est donc sans doute pas dans les règles de l’art (mais je n’ai pas trouvé mieux pour l’instant). N’hésitez pas à me faire signe si vous avez de meilleures solutions. |
Le template
Pour créer le template, nous allons simplement installer une VM Ubuntu manuellement, en faisant attention à certains points :
À l’installation, on crée le disque de la plus petite taille dont on a besoin, en utilisant LVM, ce qui permettra de le redimensionner en fonction des besoins.
Après l’installation, on applique les opérations indiquées dans cet article VMWare, en particulier la suppression de cloud-init, installé par défaut.
sudo apt purge cloud-init
sudo apt autoremove
sudo rm -rf /etc/cloud
sudo sed -i -e 's|D /tmp|#D /tmp|g' /usr/lib/tmpfiles.d/tmp.conf
# ...
[Unit]
# ...
After=dbus.service
Si on veut une configuration réseau de la machine en DHCP, il faut savoir qu’Ubuntu ne présente pas par défaut l’adresse MAC en réponse aux requêtes DHCP. On peut immédiatement modifier ce comportement : Fichier /etc/netplan/00-installer-config.yaml
|
Ces opérations effectuées, on peut convertir la machine virtuelle en template.
Déploiement du template
Comme on l’a vu, lors du déploiement, on ne peut rien configurer si on n’a pas un vCenter à jour. Il va donc falloir configurer la VM manuellement, en effectuant un certain nombre d’opérations :
Changement du nom d’hôte de la machine
sudo hostnamectl set-hostname vm_new_hostname
Changement des clés SSH de la machine
Si on a installé un serveur SSH lors de l’installation Ubuntu, on régénère les clés SSH de la machine pour éviter qu’elles soient identiques sur plusieurs machines distinctes.
rm -f /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
systemctl restart ssh
Changement d’adresse IP
Si on a choisi une IP fixe plutôt qu’une configuration DHCP, la VM a été déployée avec l’adresse IP définie pour le template.
On ne peut dans ce cas déployer qu’une machine virtuelle à la fois (si on la configure en SSH). Après changement de l’adresse IP (ci-dessous), on peut déployer la machine suivante, etc. |
sudo sed -i "s|192.168.0.10/24|192.168.0.42/24|" /etc/netplan/00-installer-config.yaml (1)
sudo netplan apply (2)
1 | Adresse/masque à remplacer par les valeurs de votre choix. |
2 | Attention : au moment de la configuration de l’adresse IP définitive de la machine, la connexion SSH est coupée. |
Redimentionnement du disque
On suppose ici qu’on n’a configuré à l’installation qu’un seul disque, avec le partitionnement LVM par défaut, soit :
|
Si on a configuré la machine virtuelle avec plus d’espace disque que le template, on doit affecter cet espace .
fdisk /dev/sda
# Dans la console fdisk
n # Nouvelle partition
4 # Création de sda4 (1)
\n # Début de l'espace disponible (on laisse par défaut).
\n # Affecter tout l'espace disponible (par défaut).
w # Écrire la nouvelle table des partitions
1 | À modifier si vous choisissez un partitionnement différent. On peut également laisser vide pour laisser la valeur par défaut. |
pvcreate /dev/sda4
vgextend ubuntu-vg /dev/sda4
lvextend -l+100%FREE /dev/ubuntu-vg/ubuntu-lv /dev/sda4
resize2fs /dev/ubuntu-vg/ubuntu-lv
Là aussi, il faudra adapter le script si vous choisissez un partitionnement plus complexe.
Script de configuration
On aimerait maintenant éviter d’effectuer pour chaque machine toutes ces opérations qui sont inutilement répétitives. On crée donc un script de configuration, dont les seuls paramètres sont le nom d’hôte de la machine et son adresse IP (cette partie étant inutile en DHCP).
#!/bin/bash
# Script de configuration d'une VM déployée à partir d'un template Ubuntu Server.
# Le script doit être exécuté avec les droits d'administration.
if [ "$#" -ne 2 ]; then
echo "Usage: ubuntu_template_config.sh HOSTNAME ADRESSE_IP"
exit 1
fi
DEST_HOSTNAME=$1
DEST_IP=$2
TEMPLATE_IP=192.168.0.10
DNS_MASK=24
# Modification du nom de la machine.
hostnamectl set-hostname ${DEST_HOSTNAME}
# Modification de l'adresse IP.
sed -i "s|${TEMPLATE_IP}/${DNS_MASK}|${DEST_IP}/${DNS_MASK}|" /etc/netplan/00-installer-config.yaml
# sudo netplan apply (1)
# Régénération des clés SSH de la machine.
rm -f /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
systemctl restart ssh
# Modification de la taille du disque.
# Le template contient déjà les disques sda1 (grub), sda2 ('/boot'), et sda3 ('/' utilisant LVM).
# Si cette ligne est présente dans la sortie d'erreur, cela signifie que le disque a été redimentionné avant déploiement du template.
# On applique alors un redimentionnement LVM pour le prendre en compte.
fdisk -l /dev/sda 2>&1 | grep "GPT PMBR size mismatch"
if [ "$?" -eq 0 ]; then
# Création de sda4 avec le disque manquant.
sed -e 's/\s*\([\+0-9a-zA-Z]*\).*/\1/' << EOF | fdisk /dev/sda
n # Nouvelle partition
4 # sda4
# Début de l'espace disponible
# Fin de l'espace disponible
w # Écriture de la table des partitions
EOF
# Extension LVM.
pvcreate /dev/sda4
vgextend ubuntu-vg /dev/sda4
lvextend -l+100%FREE /dev/ubuntu-vg/ubuntu-lv /dev/sda4
resize2fs /dev/ubuntu-vg/ubuntu-lv
fi
1 | On ne reconfigure pas le service réseau immédiatement, car cela aurait pour effet d’arrêter le script si celui-ci est exécuté via SSH.
Il ne faut donc pas oublier d’appliquer manuellement la configuration netplan . |
Ce script suppose un certain nombre de choses sur le template (partitionnement des disques, serveur SSH déjà installé, etc.). Il est bien évidemment à adapter en fonction des choix effectués lors de l’installation. |
Le mot de la fin
Ubuntu 20.04 n’était évidemment qu’un exemple. On peut décliner cette méthode pour créer un script de "post-configuration" pour d’autres distributions dont la configuration n’est pas directement possible sur VSphere.