Benoît Courtine



    Navigation
     » Accueil
     » A propos
     » Mentions légales
     » XML Feed

    Template Ubuntu 20.04 sur VSphere

    02 Dec 2020 (MAJ le 08/12/2020 à 10:49) » ops, script

    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.

    Suppression de cloud-init et modification .
    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
    Modification du service /lib/systemd/system/open-vm-tools.service
    # ...
    [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
    network:
      ethernets:
        ens192:
          dhcp4: true
          dhcp-identifier: mac
      version: 2

    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

    Changement du nom d’hôte
    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.

    Régénération des clés SSH de la machine
    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.
    Modification de l’adresse IP
    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 :

    • /dev/sda1 pour le bootloader ;

    • /dev/sda2 /boot ;

    • /dev/sda3 / ;

    Si on a configuré la machine virtuelle avec plus d’espace disque que le template, on doit affecter cet espace .

    Création de /dev/sda4 avec l’espace additionnel
    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.
    Redimentionnement LVM de la partition '/'
    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).

    Script complet de configuration
    #!/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.