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
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