Déployer un serveur PXE avec Docker

TG
  • Tommy Gingras
    Studio Webux S.E.N.C
    23 Mars 2019

Objectif

Le PXE serveur est utilisé pour faciliter et automatiser à un certain point les déploiements dans un réseau.

Ce PXE est utilisé en pair avec un serveur DHCP, celui-ci est externe donc la configuration du DHCP devra rediriger les clients PXE vers le conteneur. Ce qui sera couvert dans un autre post.

Cette configuration fonctionne uniquement en IPv4 et Legacy

Pré-requis

  • Docker
  • Docker Compose
  • Du storage local ou externe selon votre environnement (le storage est local dans ce projet)
  • Un lien internet et un lien sur le réseau de déploiement (WAN et LAN)

Étape 1 - récupérer l’image docker

l’image est disponible sur le docker hub et sur github

github

docker hub

lancer cette commande sur votre système,

docker pull studiowebux/pxe-server

Étape 2 - Lancer le conteneur

Vous pouvez lancer l’image manuellement ou utiliser le docker-compose disponible sur Github.

docker run -it --name pxe \
-p 21:21 \
-p 68:68/udp \
-p 68:68 \
-p 69:69/udp \
-p 4011:4011/udp \
-p 20:20 \
-p 33333-33343:33333-33343 \
-v $PWD/netboot/:/tftpboot/netboot \
-v $PWD/pxelinux.cfg/:/tftpboot/pxelinux.cfg/ \
-v $PWD/pub/:/var/ftp/pub/:ro \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /tmp/$(mktemp -d):/run \
--privileged \
pxe-server:latest

Cette ligne lance le conteneur avec tout ce dont vous avez besoin pour avoir un PXE serveur de base.

Pour utiliser ce PXE, n’oubliez pas de configurer votre serveur DHCP pour pointer sur cette machine. (Ceci sera couvert dans un autre article)

Si vous voulez utiliser le docker-compose:

git clone https://github.com/studiowebux/pxe-server.git
cd pxe-server/
docker-compose up -d

Vous devriez obtenir le même résultat que la commande manuelle.

Étape 3 - Ajouter une image d’installation

Toutes les étapes qui suivent sont effectué sur la machine host,

Télécharger l’image

Selon vos besoins, choisissez l’image qui vous convient, ici CentOS 7.6 est utilisé.

wget http://mirror2.evolution-host.com/centos/7.6.1810/isos/x86_64/CentOS-7-x86_64-Minimal-1810.iso

Ajout des fichiers dans netboot

Il faut monter l’ISO téléchargé

sudo mount -o loop CentOS-7-x86_64-Minimal-1810.iso /mnt/

Puis on doit copier les fichier vmlinuz et initrd.img dans le répertoire du conteneur.

Ces fichiers permettent de démarrer l’image à partir du réseau.

Ici le docker-compose a été utilisé, donc les fichiers doivent être copiés vers /srv/pxe/netboot

mkdir -p /srv/pxe/netboot/centos/76/
sudo cp /mnt/isolinux/{initrd.img,vmlinuz} /srv/pxe/netboot/centos/76/

Copier le contenu du disque

Ici uniquement le ftp est couvert, mais il existe plusieurs méthodes pour effectuer cette tâche, par exemple NFS (qui est beaucoup mieux).

mkdir -p /srv/pxe/pub/images/centos/76/
sudo cp -av \* /srv/pxe/pub/images/centos/76/

Ajout du kickstart

L’usage du PXE permet d’automatiser l’installation des OS, pour RHEL et Centos ce fichier se nomme kickstart.

alors voici un exemple simple de ce fichier, vous pouvez le modifier et l’adapter à vos besoins.

le mot de passe doit être généré de cette manière

openssl passwd -1 myPassword

Résultat obtenu:

$1$cDATzvbJ\$fMOQljRXjabnai/IfJHpb.

Le fichier ks.cfg

#platform=x86, AMD64, or Intel EM64T
#version=DEVEL

# Firewall configuration

firewall --disabled

# Install OS instead of upgrade

install

# Use FTP installation media

url --url="ftp://192.168.10.5/pub/images/centos/76"

# Root password

rootpw --iscrypted $1$cDATzvbJ\$fMOQljRXjabnai/IfJHpb.

# System authorization information

auth useshadow passalgo=sha512

firstboot disable

# System keyboard

keyboard us

# System language

lang en_US

# SELinux configuration

selinux disabled

# Installation logging level

logging level=info

# System timezone

timezone America/Toronto

# System bootloader configuration

bootloader location=mbr
clearpart --all --initlabel
part swap --asprimary --fstype="swap" --size=1024
part /boot --fstype xfs --size=300
part pv.01 --size=1 --grow
volgroup root_vg01 pv.01
logvol / --fstype xfs --name=lv_01 --vgname=root_vg01 --size=1 --grow

%packages
@^minimal
@core

%end
%addon com_redhat_kdump --enable --reserve-mb='auto'
%end

Ajout de l’entrée dans le PXE

Maintenant il faut ajouter les liens vers ces fichiers pour que les clients puissent démarrer sur ce serveur:

nano /srv/pxe/pxelinux.cfg/default

Ajouter ce qui suit:

default menu.c32
prompt 0
timeout 30
MENU TITLE webuxlab

LABEL centos76
MENU LABEL CentOS 7.6
KERNEL /netboot/centos/76/vmlinuz
APPEND initrd=/netboot/centos/76/initrd.img inst.repo=ftp://192.168.10.5/pub/images/centos/76 ks=ftp://192.168.10.5/pub/kickstarts/centos/76/ks.cfg

Pour les nouveaux entrées:

LABEL centos8
MENU LABEL CentOS 8
...

Le paramètre inst.repo= est celui qui peut être remplacé par un serveur NFS (ceci sera couvert dans un autre article)

Le paramètre ks= peut aussi être utilisé avec un serveur http.

Le choix de NFS et http est mieux car c’est plus rapide. Cependant avec FTP c’est plus simple à mettre en place.

Conclusion

Vous devez avoir un serveur DHCP externe pour que tout cela fonctionne et ce serveur doit pointer sur la machine physique du docker.

Example avec un serveur PFSense

PFSense DHCP configuration avec pxe

Le next server correspond au serveur sur lequel vous avez lancer le conteneur Le Default BIOS file name est le fichier pxelinux.0 qui se trouve dans le conteneur

PFSense avec serveur DHCP