Ich hatte heute den Fall, dass ich 33 gleich aussehende LXC Container erstellen musste.
In jedem LXC Container sollten Basispakete wie vim
, curl
, htop
, sysstat
und so weiter
installiert sein.
Zusätzlich wollte ich, dass direkt mein Apt-Cacher-ng
verwendet wird, in allen Container die richtige .bashrc
geladen ist und der
Proxy-Server überall eingetragen ist.
Dies hätte man natürlich auch über ein Automatisierungstool wie Ansible oder Puppet lösen können. Allerdings ist der Aufwand in der Regel etwas größer, alle Regeln in Ansible und Co abzubilden. Ein Container-Template ist dagegen schnell gebaut.
Vorbereitungen
Ich habe meine LXC-Templates bisher immer direkt auf dem Proxmox VE Server angepasst.
Wichtig ist, ich werde kein komplett neues Template erstellen, sondern ein existierendes Template anpassen. Warum sollte man sich auch die Arbeit machen, die andere schon für einen getan haben?
Um Software inerhalb des Templates installieren zu könmnen, muss das Paket systemd-container
auf dem System installiert sein,
auf dem ihr das Template anpassen wollt.
apt-get install systemd-container
Template anpassen
Proxmox VE speichert die LXC Templates unter /var/lib/vz/template/cache/
.
Ich werde für mich das Template ubuntu-16.04-standard_16.04-1_amd64.tar.gz
anpassen,
da bei mir alles auf Ubuntu läuft.
Zuerst kopiere ich mir das originale Template, da ich dies natürlich nicht kaputt machen möchte.
mkdir /tmp/mein_template
cd /tmp/mein_template
cp /var/lib/vz/template/cache/ubuntu-16.04-standard_16.04-1_amd64.tar.gz .
tar xfv ubuntu-16.04-standard_16.04-1_amd64.tar.gz --numeric-owne
rm ubuntu-16.04-standard_16.04-1_amd64.tar.gz
Nach dem Entpacken hat man dann das Dateisystem des Containers vor sich.
Wenn man nur ein paar Dateien anpassen möchte, kann man dies direkt hier tun. Zum Beispiel
Apt-Cacher-ng in der Datei etc/apt/sources.list
oder
einen Proxy-Server in etc/environment
setzen.
Achtung: Der fehlende /
am Anfang ist kein Tippfehler! Man befindet sich
noch nicht "innerhalb" des Templates, sondern hat nur die Dateien auf der Festplatte liegen.
Programme im LXC Template installieren
Jezt wird es interessant.
Mit dem Befehl systemd-nspawn -D /tmp/mein_template
springe ich nun in das LXC Template.
root@pve1:/tmp/mein_template# systemd-nspawn -D /tmp/mein_template
Spawning container mein_template on /tmp/mein_template.
Press ^] three times within 1s to kill container.
root@mein_template:~#
Ab jetzt befinde ich mich "innerhalb" des LXC Templates. Ich kann hier also
über apt-get install
alles installieren, was ich benötige oder nach belieben
Dateien verändern.
Damit der Container DNS-Anfragen auflösen kann, müsst ihr zuerst euren DNS-Server setzen.
rm /etc/resolv.conf
echo "nameserver 192.168.1.1" > /etc/resolv.conf
Nachdem alles installiert und angepasst ist, könnt ihr den Container wieder verlassen.
Um die Größe des Templates zu reduzieren, sollte man noch alle heruntergeladenen
Pakete von apt
löschen.
apt-get clean
Den Container kann man mit STRG+D
oder logout
wieder verlassen.
root@mein_template:~# logout
Container mein_template exited successfully.
root@pve1:/tmp/mein_template#
Neues Template erstellen
Nun erstelle ich von dem angepassten Template ein neues tar.gz
mit dem Namen
ubuntu-xenial_modified_amd64.tar.gz
.
tar -zcvf /tmp/ubuntu-xenial_modified_amd64.tar.gz . --numeric-owner
Danach kann man das Template einfach wieder zu den anderen kopieren
cp /tmp/ubuntu-xenial_modified_amd64.tar.gz /var/lib/vz/template/cache/
und sieht es sofort in der Proxmox VE Web-Oberfläche.
Nun kann man LXC Container erstellen, welche das angepasste Template verwenden.
Damit man gleich sieht, dass dieser Container aus einem angepassten Template erstellt wurde,
habe ich in die modt
einfach einmal mein CrateDB ASCII Logo gepackt.
Viele LXC Container auf einmal erstellen
Proxmox VE hat zum Glück gleich ein praktisches Tool, um LXC Container über die CLI zu erstellen.
Wer mehr dazu wissen möchte, sollte einmal man pct
lesen.
Hier ein kleines Beispiel was einen LXC Container mit 2 CPU Kernen, 4GB RAM und 12GB HDD erstellt:
pct create --password --arch amd64 --cmode tty --console 1 --cores 2 --memory 4096 --net0 bridge=vmbr0,name=eth0,ip=dhcp --rootfs local-zfs:12 --ostype ubuntu --hostname foobar 1337 local:vztmpl/ubuntu-xenial_modified_amd64.tar.gz