Après l'étude d'un système cobbler existant, on va dockeriser cette application bien pratique pour l'installation automatique.
Un système cobbler comporte plusieurs services:
L'analyse du système existant nous montre
Seulement quelques répertoires contiennent des données personnalisées:
/var/lib/cobbler: Ce répertoire contient deux types de données:
/var/www/cobbler: qui contient le dépôt de paquets RPM des distributions importées. Ces fichiers sont servis par le serveur web et ce répertoire sera intégré dans un volume de données.
/var/lib/tftp: qui contient le noyau bootable (pxelinux.0) , le menu d'installation, etc... Ces fichiers sont servis par le serveur tftpd et ce répertoire sera intégré dans un volume de données
On aura besoin d'un cinquième point de montage (/mnt sur le conteneur) où les isos des distributions seront montées par le serveur hôte.
mkdir /mnt/centos
mount -o ro /path/to/iso/CentOS-7-x86_64-DVD-1804.iso /mnt/centos
Et même d'un sixième point de montage, si l'hôte du conteneur a un noyau inférieur à 4.7, à cause du bug concernant les sockets unix sur overlayfs (lien): /var/run/supervisor
Bien entendu, pour ajouter un modèle de kickstart ou un snippet, l'image docker devra être reconstruite. Mais à l'usage, on se rend compte qu'on ajoute/modifie moins de fichiers snippets ou kickstart, que la disponibilité des mises à jour du paquet cobbler.
L'image peut être trouvée sur docker.io
docker pull tartarefr/docker-cobbler
Le service docker peut être personnalisé via les variables d'environnement suivantes:
hostname --ip-address | awk '{print $1}'
On commence par télécharger l'iso DVD de centos 7
Il va nous falloir construire 5 volumes docker pour un conteneur (même ratio que le pastis)
docker volume create cobbler_www
docker volume create cobbler_tftp
docker volume create cobbler_config
docker volume create cobbler_backup
docker volume create cobbler_run
On créé le point de montage de notre iso
sudo mkdir /mnt/centos
On monte notre iso dans /mnt/centos
sudo mount -o ro /path/to/iso/CentOS-7-x86_64-DVD-1804.iso /mnt/centos
Je conseille fortement de modifier la valeur de _DEFAULT_ROOTPASSWD. En effet c'est un des tout premiers mot de passe root essayé par les pirates.
Contrairement à la valeur par défaut, notre serveur web (api et cobbler_web) sera accessible depuis l'hôte sur le port 60080.
docker run -d --privileged
-v cobbler_www:/var/www/cobbler:z
-v cobbler_tftp:/var/lib/tftp:z
-v cobbler_config:/var/lib/cobbler/config:z
-v cobbler_backup:/var/lib/cobbler/backup:z
-v cobbler_run:/var/run/supervisor:z
-v /mnt/centos:/mnt:z
-e DEFAULT_ROOT_PASSWD=cobbler
-e HOST_IP_ADDR=$(hostname --ip-address | awk '{print $1}')
-e HOST_HTTP_PORT=60080
-e COBBLER_WEB_USER=cobbler
-e COBBLER_WEB_PASSWD=cobbler
-e COBBLER_WEB_REALM=Cobbler
-e COBBLER_LANG=fr_FR
-e COBBLER_KEYBOARD=fr-latin9
-e COBBLER_TZ=Europe/Paris
-p 69:69/udp
-p 60080:80
-p 60443:443
-p 25151:25151
--name cobbler
tartarefr/docker-cobbler:latest
Une fois à l'intérieur du conteneur, on va ajouter la cible memtest à notre menu d'installation, puis on va importer notre distribution centos 7, ajouter un profile supplémentaire qui permettra d'installer centos 7 avec un environnement graphique et synchroniser le tout.
Immersion dans notre conteneur
docker exec -ti cobbler /bin/bash
Ajout de la cible memtest. On vérifie au préalable que le fichier /boot/memtest86+-5.01 existe bien (la version peut être modifiée et la ligne suivante doit être adaptée en conséquence)
cobbler image add --name=memtest86+ --file=/boot/memtest86+-5.01 --image-type=direct
Import de la distribution centos 7
cobbler import --path=/mnt --name=CentOS-7-x86_64
Ajout du profile pour une installation d'une centos desktop
cobbler profile add --name=CentOS-7-x86_64-Desktop
--distro=CentOS-7-x86_64
--kickstart=/var/lib/cobbler/kickstarts/sample_end.ks
--virt-file-size=12
--virt-ram=2048
cobbler profile edit --name CentOS-7-x86_64-Desktop --ksmeta="type=desktop"
Synchronisation
cobbler sync
Malheureusement, le changement de fichier iso (démontage et le montage d'un autre iso sur le même point de montage) sur l'hôte ne met pas à jour le contenu du répertoire /mnt dans le conteneur. Pour ajouter une autre distribution, il faudra:
Pour ajouter un modèle de kickstart ou un snippet, il suffit de placer le fichier dans le répertoire idoine et de modifier le fichier Dockerfile:
J'ai préféré construire une image en partant de zéro, car celles disponibles sont soit plus mise à jour, soit elles utilisent systemd. Je préfère garder cette option pour les cas particuliers, inutile de sortir le tank pour écraser un moustique.
Supervisord est un bien meilleur candidat pour le poste d'orchestrateur dans un conteneur (le bon outil pour la bonne tâche) et permet de redémarrer un ou plusieurs services.
supervisorctl restart cobblerd
L'ensemble du projet cobbler est versionné sur gitlab, et en copie sur github (pour la construction automatique des images sur docker.io).
Fichier Dockerfile
FROM centos:7
MAINTAINER Didier FABERT (tartare) <didier@tartarefr.eu>
# RPM REPOs
RUN yum install -y
epel-release
&& yum clean all
&& rm -rf /var/cache/yum
RUN yum update -y
&& yum clean all
&& rm -rf /var/cache/yum
RUN yum install -y
cobbler
cobbler-web
pykickstart
debmirror
curl wget
rsync
supervisor
net-tools
memtest86+
&& yum clean all
&& rm -rf /var/cache/yum
# Copy supervisor conf
COPY supervisord/supervisord.conf /etc/supervisord.conf
COPY supervisord/cobblerd.ini /etc/supervisord.d/cobblerd.ini
COPY supervisord/tftpd.ini /etc/supervisord.d/tftpd.ini
COPY supervisord/httpd.ini /etc/supervisord.d/httpd.ini
# Copy personnal snippets
COPY snippets/partition_config /var/lib/cobbler/snippets/partition_config
COPY snippets/configure_X /var/lib/cobbler/snippets/configure_X
COPY snippets/add_repos /var/lib/cobbler/snippets/add_repos
COPY snippets/disable_prelink /var/lib/cobbler/snippets/disable_prelink
COPY snippets/systemd_persistant_journal /var/lib/cobbler/snippets/systemd_persistant_journal
COPY snippets/rkhunter /var/lib/cobbler/snippets/rkhunter
COPY snippets/enable_X /var/lib/cobbler/snippets/enable_X
COPY snippets/yum_update /var/lib/cobbler/snippets/yum_update
# Copy personnal kickstart
# Activate personnal snippets
RUN for kickstart in sample sample_end legacy ;
do
additional_post_snippets="" ;
for snippet in
add_repos
disable_prelink
systemd_persistant_journal
rkhunter
enable_X
yum_update ;
do
additional_post_snippets="${additional_post_snippets}n$SNIPPET('${snippet}')" ;
done ;
sed -i
-e "/post_anamon/ s/$/${additional_post_snippets}/"
-e "/^autopart/ s/^.*$/$SNIPPET('partition_config')/"
-e "/^skipx/ s/^.*$/$SNIPPET('configure_X')/"
/var/lib/cobbler/kickstarts/${kickstart}.ks ;
done
# Install vim-enhanced by default and desktop packages if profile have el_type set to desktop (ksmeta)
RUN echo -e "@corennvim-enhancedn#set $el_type = $getVar('type', 'minimal')n#if $el_type == 'desktop'n@basen@network-toolsn@x11n@graphical-admin-toolsn#set $el_version = $getVar('os_version', None)n#if $el_version == 'rhel6'n@desktop-platformn@basic-desktopn#else if $el_version == 'rhel7'n@gnome-desktopn#end ifn#end ifnkernel" >> /var/lib/cobbler/snippets/func_install_if_enabled
COPY first-sync.sh /usr/local/bin/first-sync.sh
COPY entrypoint.sh /entrypoint.sh
RUN chmod 755 /entrypoint.sh /usr/local/bin/first-sync.sh
EXPOSE 69 80 443 25151
VOLUME [ "/var/www/cobbler", "/var/lib/tftp", "/var/lib/cobbler/config", "/var/lib/cobbler/backup", "/var/run/supervisor", "/mnt" ]
ENTRYPOINT /entrypoint.sh
Lancement de la construction
docker build -t local/cobbler .
En cas de problème, ne pas hésiter à regarder le fichier /var/log/cobbler/cobbler.log