Setup VM template e cloud-init

Un breve promemoria che spiega come preparare il template per una VM Linux su Proxmox VE, configurando anche il sistema cloud-init.

Se usate un qualche software di virtualizzazione, come ad esempio VMware vSphere o Proxmox VE, la possibilità di generare nuove macchine virtuali partendo da un template può risultare estremamente comoda, soprattutto quando avete necessità di fare il deploy di tante macchine simili tra di loro.

Un template non è altro che un modello di macchina virtuale, una specie di “stampo” con cui produrre (allocare) tante macchine uguali tra loro. Avere dei template già pronti per macchine virtuali che devono funzionare da server web, da database server, da application server o da quello che volete, vi può risparmiare molte ore che invece dovreste dedicare ogni volta all’installazione e alla configurazione del software necessario.

Inoltre, una volta messo a punto un template, sarete sicuri che ogni macchina virtuale derivata da esso sarà configurata esattamente allo stesso modo, senza dimenticare nulla.

Come si crea un template

L’operazione di allocare una nuova VM partendo da un template è molto simile alla clonazione. Tuttavia, per funzionare bene ed evitare problemi, è raccomandabile fare in modo che ciascuna VM abbia degli attributi che la definiscono in maniera univoca.

Tra questi attributi ci sono sicuramente il machine-id (per quei sistemi che ne fanno uso) e le chiavi host utilizzate per cifrare le sessioni ssh (secure shell). Sarebbe il caso che questi elementi differiscano sempre rispetto a quelli della VM dalla quale si produce il clone. Trattando opportunamente la macchina che si usa per fare il template, si può fare in modo che tali attributi vengano generati ex-novo ogni volta che se ne esegue il clone.

In una delle puntate della sua serie dedicata a ProxmoxVE, Jay LaCroix ci spiega nel dettaglio come procedere:

Creating Virtual Machine Templates, by LearnLinuxTV

Nel video viene anche spiegato come configurare il sistema cloud-init quando si utilizza ProxmoxVE come sistema di virtualizzazione.

Setup del template, passo passo

Di seguito elenco sinteticamente quali sono i passi da intraprendere. Nell’esempio viene preso in considerazione un sistema Ubuntu Server 20.04, ma le operazioni sono analoghe con qualsiasi distribuzione Linux.

  1. Aggiornare la cache dei pacchetti ed installare gli aggiornamenti disponibili:
    sudo apt update && sudo apt upgrade
  2. Installare di tutto il software che si vuole sia sempre presente nei cloni derivati dal template
  3. Installare il pacchetto cloud-init:
    sudo apt install cloud-init
  4. Installare l’agent qemu:
    sudo apt install qemu-guest-agent
  5. Ripulire la cache dei pacchetti:
    sudo apt clean
  6. Rimuovere i pacchetti residui non più necessari:
    sudo apt autoremove
  7. Rimuovere le chiavi host ssh:
    sudo rm /etc/ssh/ssh_host_*
  8. Rimuovere il contenuto del file machine-id (non cancellare il file):
    sudo truncate -s 0 /etc/machine-id
  9. Se presente, rimuovere il file machine-id anche dalla directory /var/lib/dbus:
    sudo rm /var/lib/dbus/machine-id
  10. Creare un link simbolico al file machine-id in /var/lib/dbus/:
    sudo ln -s /etc/machine-id /var/lib/dbus/machine-id
  11. Spegnere la macchina virtuale:
    sudo shutdown -h now

A questo punto, il sistema operativo è “pulito”, ma c’è ancora qualche passaggio da fare prima di trasformare la macchina in template.

  1. Nella sezione Hardware, sganciare l’immagine ISO di installazione dal lettore cd virtuale della VM, selezionando l’opzione “Do not use any media“.
  2. Convertire la VM in template: click destro sul nome della VM e poi “Convert to template” (vedi figura sottostante)
Schermata che mostra la voce di menu che converte una VM in template in ProxmoxVE
Conversione della VM in template

Ora il template è pronto per essere usato. Tuttavia, aggiungendo un’immagine cloud-init potete fare in modo di automatizzare alcuni aspetti della configurazione delle macchine da esso derivate, senza intervenire manualmente.

Configurazione cloud-init

Per farlo, è sufficiente modificare il template andando in Hardware e aggiungendo un drive CloudInit:

Schermata che mostra come aggiungere un drive cloud-init al template della VM
Aggiunta del drive cloud-init alla VM

Ora, spostandovi nella sezione Cloud-Init del template, potete personalizzare l’immagine per automatizzare alcuni aspetti della configurazione delle VM clonate da esso:

Schermata che mostra le opzioni di configurazione di cloud-init su ProxmoxVE
Opzioni di configurazione dell’immagine cloud-init del template

In questa sezione potete, per esempio, configurare il nome di un utente, con relativa password, che dovrà essere presente sulla VM; potete inoltre configurare le opzioni di rete ed, eventualmente, una chiave pubblica per l’accesso SSH.

Questo vi risparmierà di dover eseguire queste operazioni, manualmente, ogni volta che istanzierete una VM partendo da questo template.

Dopo aver modificato le opzioni di Cloud-Init, è sempre necessario cliccare sul pulsante “Regenerate Image” per renderle effettive.

Per generare una nuova VM partendo dal template appena realizzato, fate click destro sul nome del template e cliccate “Clone“. Il risultato sarà una macchina identica al template, ma con machine-id e chiavi host univoche. In più la nuova macchina erediterà le impostazioni che avete configurato in Cloud-Init.

Aggiornamento 4/11/2021

Sebbene i passaggi sopra elencati siano corretti, eseguendoli sul mio “serverino” Proxmox VE (aka cosetto), si verifica un problema quando il sistema guest è Ubuntu 20.04.

In particolare sembra che accadano sostanzialmente due cose:

  1. l’immagine cloud-init non viene eseguita all’avvio del clone, quindi non viene creato l’utente specificato e non viene caricata la chiave ssh pubblica impostata;
  2. le chiavi host ssh non vengono rigenerate al primo avvio della VM clonata dal template.

Questi problemi non si riscontrano se si creano template per Centos 7, Rocky Linux (derivata da Red Hat Enterprise Linux 8) e Debian 11.

Di seguito mostro l’output di alcuni comandi eseguiti su un clone derivato da un template Rocky Linux, prodotto esattamente seguendo le operazioni illustrate nel post:

Screenshot che mostra le informazioni di configurazione di rete e utente su un clone derivato da template Rocky Linux
Informazioni su configurazione di rete e utente su un clone derivato da template Rocky Linux

Si osserva in particolare che l’interfaccia eth0 è stata creata e configurata da cloud-init, e che è già presente l’utente gianluca con la relativa chiave pubblica memorizzata nella sua home directory. L’utente gianluca non era presente sul template, ma è stato aggiunto da cloud-init.

Aggiornerò ulteriormente questo post qualora riuscissi a venire a capo del problema con Ubuntu 20.04.