J’ai acheté des machines physiques pour mon homelab, un Dell OptiPlex 3040 et un Lenovo Thinkcentre M710q. J’ai réalisé un petit repo pour pouvoir installer ces nouvelles machines de manière automatique et directement depuis leur sous-réseau. Elles sont branchées en ethernet directement dans le LAN Homelab (via un switch). Tout le nécessaire peut être trouvé dans ce repo de netboot.
Théorie
La machine de management fait office de serveur TFTP pour servir les fichiers PXE. Il faut donc paramétrer son adresse IP dans l’outil qui sert à servir la configuration DHCP.
Dans mon cas il s’agit d’OPNSense :
Les différents noms de fichiers sont servis au démarrage de la machine sur le netboot, selon leur méthode de boot (BIOS/UEFI). Ces fichiers sont récupérés depuis http://boot.ipxe.org.
Le but ici est le chainloading vers iPXE : quel que soit la méthode de boot, le chargement du fichier chargera l’iPXE, relancera une passe de configuration DHCP, et chargera finalement le fichier main.ipxe.
Ainsi on arrivera au démarrage souhaité.
Le menu de main.ipxe nous fait choisir le mode d’installation de notre distribution. On utilise les directives kernel et intird afin de télécharger et booter le noyau linux avec initrd.
Ensuite vient donc le chargement de notre distribution à proprement parler.
Compléments
En parallèle de serveur TFTP, je configure un simple serveur HTTP pour accélérer la distribution des fichiers de la distribution. Ces deux services seront fournis par des containers Docker : un httpd standard et un TFTP custom (installation de tftpd-hpa sous Debian).
Le fichier Makefile permet de prendre en compte les différentes étapes nécessaires:
- récupération des fichiers PXE pour le chainloading
- récupération de la distribution a booter
- lancement des containers (TFTP, HTTP)
J’ai ajouté un fichier preseed simple afin de pouvoir faire l’installation automatiquement. La seule partie manuelle reste d’allumer la machine, de choisir le boot par réseau et de sélectionner l’installation automatique. Toujours besoin d’un écran et d’un clavier pour l’instant …
Pratique
Pour passer à la pratique, rien de plus simple.
Brancher clavier et écran sur la machine.
Depuis le poste de travail, se connecter sur la machine de management.
Cloner le repo si besoin et y lancer make
.
Une fois que tout est up on peut démarrer la machine à installer.
Il faudra éventuellement changer l’ordre de boot des machines, soit en passant par le BIOS soit en changeant temporairement (F12 pour ces deux machines).
Dans le menu proposé ensuite il suffit de choisir “Debian preseed” pour une installation automatique. Une fois l’installation réalisée la machine doit booter depuis son disque.
Bilan et perspectives
Pour ce projet j’ai utilisé Docker de manière simple (custom Dockerfile simple et docker-compose).
J’ai également utiliser make
qui reste la base en matière d’automatisation de tâches sur serveur Linux.
J’ai revu le fonctionnement du boot sous Linux, toujours intéressant : PXE, iPXE, initrd/initramfs, etc
J’ai particulièrement dû apprendre le DHCP, qui est loin d’être évident !
Le chainloading se passe très bien et les installations également jusqu’ici. Tester avec des VMs dans Proxmox est un moyen rapide d’avoir du retour mais n’est pas exhaustif pour le matériel réel.
Pour le futur, les points clés seront sans doute :
- la connexion KVM pour éviter de brancher clavier-écran à chaque installation/réinstallation
- étendre les distributions disponibles (Promox, famille Red Hat, Talos ?)
- passer par Packer pour pré-packager des machines en outils
Il reste quelques problèmes (sur le hostname par exemple) mais rien qu’Ansible ne puisse réparer.
Pour ce genre de travail une solution plus “professionnelle” serait d’utiliser Metal As A Service (MAAS) par Canonical. Sur Youtube TechnoTim a une vidéo plutôt complète sur l’installation et la configuration.