Lxc Debian Wheezy LAMP Template

Una delle cose di cui ho sempre sentito la mancanza, a proposito di macchine virtuali, è il non poter utilizzare dei "meta-template", ovvero il non poter automatizzare la configurazione di un environment di base un pò più complesso di quello minimale di default.
Spesso, ad esempio, mi capita di dover approntare delle vm dotate di sistema LAMP che poi "terzi" finiranno di configurare secondo necessità.
Con LXC, che uso ormai da tempo, l'installazione del "sistema base" è davvero rapida visto che basta solo impartire un comando passandogli come parametro il template desiderato.
Il problema è che poi bisogna compiere tutta una serie di operazioni "a manina" che, ripetute per n container da preparare, diventano pratica non solo oltremodo noiosa, ma che finisce inevitabilmente per sottrarre tempo prezioso al mio hobby preferito: girarmi i pollici.

E questo non va bene.

Ben altra vita sarebbe se si potesse, al momento della creazione del container, istruire il sistema di "post-installare" e configurare una serie di pacchetti aggiuntivi secondo schemi predeterminati.
Non sarebbe male, insomma, poter impartire un comando del genere:

# lxc-create -n foo -t lamp

e ritrovarsi alla fine con un sistema LAMP bello e pronto...

Visto che, come dice il saggio, "chi vuole fa, chi non vuole manda" (o "chi fa da se fa per tre" o ancora "non ci sono più le mezze stagioni", "si stava meglio quando si stava peggio", etc.) ho cercato (volenterosamente) di provare a garantire un futuro migliore ai miei pollici.

C'è da dire che LXC è un pacchetto che, in Wheezy, è al momento affetto da una serie di bug abbastanza seri che finiscono inevitabilmente per limitare parecchio la gestione dei container.
Ad esempio lxc-attach e lxc-execute non sono utilizzabili a causa rispettivamente del bug #595920 e del bug #664764.

Ma non è solo la gestione in sè ad essere compromessa.
A causa del bug #680469, infatti, risulta impossibile creare un container utilizzando il template fornito dal pacchetto ufficiale lxc-debian.
O per lo meno, il container viene creato ma non è utilizzabile.

Quest'ultimo problema, per fortuna, può essere superato utilizzando invece di lxc-debian, uno script che non faccia uso di live-debconfig (assente in Wheezy).

A causa dei bug di lxc-attach e lxc-execute (che comunque non ho mai utilizzato prima per installare pacchetti aggiuntivi nei container) sono stato costretto a ricorrere ad un workaround che stilisticamente, esteticamente, concettualmente, quello-che-voletemente è davvero brutto e sporco, ma grazie al quale riesco ad ottenere il risultato auspicato.
Detta con parole semplici: non m'è venuta un'idea migliore... ;)

Il workaround è abbastanza semplice e si basa sul lavoro di due script:

  • lxc-debian-wheezy-tmpl (versione modificata di questo script)
  • lxc-set-lamp (lo script che installa e configura Apache, PHP, MySQL, etc. nel nuovo container)

Entrambi (potete trovarli in questo file compresso: lxc-sub-tmpl.tar.gz) devono appartenere all'utente e al gruppo root, devono essere eseguibili e devono trovarsi nella directory /usr/share/lxc/templates.

Un "container LAMP" verrà creato lanciando direttamente lxc-debian-wheezy-tmpl passandogli il parametro -e.
Lo script, dopo aver installato il sistema base, per mezzo della funzione run_post_install, copierà lxc-set-lamp nel container e modificherà il suo /etc/rc.local affinchè esso venga eseguito al boot. Fatto questo, avvierà il container, attenderà che la configurazione del sistema LAMP sia completata, arresterà il container, eliminerà lxc-set-lamp e "pulirà" l'/etc/rc.local riportandolo come in origine.

È chiaro che le possibilità non si limitano esclusivamente ai sistemi LAMP. Tutto sta nel preparare adeguatamente gli script di post installazione avendo cura poi di nominarli secondo uno schema ben preciso.

Ad esempio:

  • lxc-set-lamp ---> /usr/share/lxc/templates/lxc-debian-wheezy-tmpl -p /var/lib/lxc/foo -e lamp
  • lxc-set-hyla ---> /usr/share/lxc/templates/lxc-debian-wheezy-tmpl -p /var/lib/lxc/bar -e hyla
  • lxc-set-pape ---> /usr/share/lxc/templates/lxc-debian-wheezy-tmpl -p /var/lib/lxc/baz -e pape
  • etc.

per creare dei container con environment lamp (apache+mysql+php), hylafax (hylafax+postfix+cups), paperino (qui+quo+qua), etc. senza bisogno di ulteriori interventi manuali.

I container creati con questo sistema potranno essere gestiti con i classici comandi di lxc (quelli non bacati ovviamente...) e non saranno diversi in nulla dai container "standard" se non per l'essere dotati fin da subito di un environment bello e pronto.

Per la felicità dei miei pollici! ;)