ProxmoxDebianCloudInit » Cronologia » Versione 18
Versione 17 (Simone Piccardi, 14-05-2024 16:47) → Versione 18/23 (Simone Piccardi, 15-05-2024 17:02)
h1. Debian su Proxmox con cloud-init "Proxmox VE":https://www.proxmox.com/en/proxmox-virtual-environment/overview è una potente piattaforma di virtualizzazione che consente di sostituire senza problemi, e senza costi di licenza, VmWare, supportando configurazioni avanzate, come clustering, HA, iperconvergenza, e molto altro. Ha inoltre il vantaggio di poter utilizzare sia le classiche macchine virtuali, su cui installare qualunque sistema operativo, che il nuovo approccio più veloce ed efficiente, dei container Linux. Dalla versione 5.x Proxmox ha aggiunto il supporto per la creazione e la configurazione automatica delle macchine virtuali utilizzando @cloud-init@ che consente di gestire direttamente dalla piattaforma le caratteristiche delle stesse (come indirizzi di rete, accessi SSH, ecc.). Vedremo come è possibile utilizzarlo per automatizzare la gestione di macchine virtuali installate con Debian, e come realizzare creare una immagine di installazione da usare come template per la creazione immediata di macchine virtuali pronte sistema operativo pronta all'uso. h2. Uso dell'immagine cloud-init di una immagine predisposta da Debian Una possibile scelta per l'uso da parte di Proxmox, è quella di scaricare una immagine pronta per il cloud fra quelle messe a disposizione direttamente da di Debian. Sono disponibili infatti delle immagini versioni non ufficiali, ufficiali a partire scaricabili a partire da https://cloud.debian.org/images/cloud. https://cloud.debian.org/images/cloud/; in particolare per Proxmox servono quelle denominate @genericloud@. Dato che le immagini non sono ufficiali, sono generate generati periodicamente, e si di dovranno cercare nella opportuna sottodirectory. Ad sottodirectory, ad esempio quelle per Debian 12 Bookworm si dovranno scaricare dalla opportun sottodirectory @bookworm@ scegliendo in genere quella generata per ultima, in sostanza si dovrà andare a crecare in da https://cloud.debian.org/images/cloud/bookworm/latest. In questa directory ci sono diversi file, le immagini infatti sono generate per più piattaforme hardware, e per Per l'uso da parte di Proxmox occorrerà selezionarne una selezionare quella per amd64. Si amd64; si può prendere sia quella nel formato @.raw@ raw che nel formato @.qcow2@, qcow2, ma quest'ultima è preferibile per le minori dimensioni ed anche perché, se usata direttamente, è già pronta per le funzionalità avanzate di gestione da parte di Proxmox, come gli snapshot. Pertanto la si potrà scaricare con: <pre> wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2 https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-arm64.qcow2 </pre> insieme all'immagine si scarichi il file con le relative checksum: <pre> wget https://cloud.debian.org/images/cloud/bookworm/latest/SHA512SUMS </pre> e si passi a verificare il tutto con il comando: <pre> sha512sum -c SHA512SUMS --ignore-missing </pre> Come primo passo occorre creare una macchina virtuale, virtuale da cui si genererà il template, ne vanno impostate anzitutto memoria e tipo di rete, facendo riferimento ad una (o più) delle interfacce di bridge disponibili (a seconda di dove la si vuole creare di default, il bridge potrà comunque essere cambiato in seguito, e se ne possono indicare più di uno se servono più interfacce), questo si fa, utilizzando un VMID non allocato, con: <pre> qm create 4242 --memory 1024 --net0 virtio,bridge=vmbr0 # --net1 virtio,bridge=vmbr1 #, etc. </pre> poi si potrà ottenere il disco della nostra macchina virtuale importando nello storage di Proxmox l'immagine scaricata, in questo caso se si sta usando LVM come backend per i dischi associato allo storage @local-lvm@ (come avviene in una installazione di default) lo si potrà fare eseguendo: <pre> root@proxmox ~ # qm importdisk 4242 debian-12-genericcloud-amd64.qcow2 debian-12-genericcloud-arm64.qcow2 local-lvm importing disk 'debian-12-genericcloud-amd64.qcow2' 'debian-12-genericcloud-arm64.qcow2' to VM 4242 ... Logical volume "vm-4242-disk-0" created. transferred 0.0 B of 2.0 GiB (0.00%) transferred 20.5 MiB of 2.0 GiB (1.00%) ... transferred 2.0 GiB of 2.0 GiB (100.00%) Successfully imported disk as 'unused0:local-lvm:vm-4242-disk-0' </pre> (si potrà usare usi al posto di @local-lvm@ qualunque un eventuale altro tipo di storage configurato su Proxmox). Questo storage), questo creerà l'immagine del disco con lo stesso schema di denominazione usato nella creazione delle macchine virtuali dall'interfaccia web (@vm-4242-disk-0@), convertendo il contenuto del file scaricato (si possono convertire tutti i formati supportati da @qemu-img@, primi fa tutti @.raw@ e @.qcow2@), per poter usare il disco nella macchina virtuale precedentemente creata occorrerà poi collegarcelo, con il comando: <pre> root@proxmox ~ # qm set 4242 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-4242-disk-0,discard=on update VM 4242: -scsi0 local-lvm:vm-4242-disk-0,discard=on -scsihw virtio-scsi-pci </pre> (si ometta il @,discard=on@ se lo storage utilizzato non supporta l'uso di discard). Si potranno poi impostare le ulteriori caratteristiche della macchina virtuale per l'uso di @cloud-init@ con: <pre> qm set 4242 --ide2 local-lvm:cloudinit qm set 4242 --boot c --bootdisk scsi0 qm set 4242 --serial0 socket --vga serial0 </pre> che predispone l'avvio dall'immagine CD usata da cloud-init per passare le configurazioni alla macchina, forza l'uso dello stesso e del disco appena collegato per l'avvio e riporta la console via seriale (dato che questa è la configurazione adottate nelle immagini cloud preparate per OpenStack come quella che abbiamo usato). Si può anche assegnare un nome alla macchina con @qm set 4242 --name templimg@, questo può essere impostato anche in sede di creazione aggiungendo a @qm create@ l'opzione @--name templimg@. A questo punto dall'interfaccia web si potrà utilizzare la sezione _Cloud-Init_ relativa alla macchina, e caricare una chiave SSH per l'accesso (_Cloud-Init->SSH-Public-Key->Edit->Load SSH Key File_). Se poi, come nel nostro caso, si vogliono fare delle modifiche all'immagine prima di trasformarla in template, le si dovrà assegnare un IP e farla partire, l'immagine fornita da Debian infatti non consente un accesso dalla console (tutti gli utenti sono bloccati senza password) per cui la console può essere utilizzata solo per accertarsi di quando il processo di boot è finito e si può provare a collegarsi con SSH. L'unico possibile accesso alla macchina infatti è via SSH con autenticazione a chiavi, usando la chiave corrispondente a quella che si è caricata come descritto in precedenza. Inoltre l'accesso a @root@ è bloccato (la chiave viene riconosciuta, ma usata per stampare il messaggio di collegarsi con utente debian) e l'unico utente disponibile è @debian@ (anche se questo può essere cambiato nella sezione _Cloud-Init_ relativa alla macchina). Si potrà pertanto entrare sulla macchina con @ssh debian@IND.IP.DEL.SERVER@ debian@ID.DE.LA.MACCHINA@ e poi eseguire @sudo -s@ per ottenere una shell di root. Dato che questa politica prevede un inutile passaggio attraverso un utente intermedio che ha comunque accesso illimitato via @sudo@, non dà di per sé nessuna garanzia di sicurezza maggiore rispetto ad un accesso diretto a @root@, al prezzo di complicare le cose per fare operazioni remote (ad esempio degli @scp@) qualora questi debbano essere effettuati coi privilegi di amministratore sulla macchina stessa. Pertanto si provvederà a ripristinare una configurazione che consenta l'accesso a @root@ con autenticazione a chiavi. chiavi, eliminando l'utente superfluo. Per far questo una volta collegati e ottenuta la shell di @root@ il primo passo sarà quello modificare la configurazione di @cloud-init@ aggiungendo in @/etc/cloud/cloud.cfg.d@ un ulteriore file di configurazione (ad esempio @/etc/cloud/cloud.cfg.d/09_enableroot.cfg@ una @/etc/cloud/cloud.cfg@, modificando la riga con @disable_root@ da @true@ a @false@ (il file è in formato YML) con un contenuto come il seguente, in modo che soprassiede la configurazione di default di @/etc/cloud/cloud.cfg@: questo diventi: <pre> # If this is set, 'root' will not be able to ssh in and they # will get a message to login instead as the above $user (debian) disable_root: false </pre> inoltre occorrerà eliminare dall'@authorized_keys@ di root il prefisso che ne blocca l'accesso, cancellando tutta la parte: <pre> no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"debian\" rather than the user \"root\".';echo;sleep 10" </pre> lasciando solo i dati della chiave a partire da @ssh-rsa@. Si @ssh-rsa@; si verifichi poi il funzionamento della modifica eseguendo un accesso diretto collegandosi con @ssh root@ID.DE.LA.MACCHINA@. Ci si ricordi poi di mettere una password a root per potersi collegare con la console sulla piattaforma di virtualizzazione, eseguendo @passwd@. A questo punto si potrà passare alle eventuali ulteriori personalizzazioni (ne parleremo più avanti) prima di trasformarla in un template. h2. Creazione di una immagine cloud-init a partire da una installazione ordinaria. L'immagine preparata da Debian che abbiamo appena visto consente di ottenere immediatamente un sistema già installato e pronto all'uso di @cloud-init@. Benché molte delle personalizzazioni del sistema che vedremo più avanti siano applicabili anche questo caso, esistono delle scelte di installazione fatte nella realizzazione dell'immagine che non è possibile modificare in un secondo tempo. Ad esempio il partizionamento del disco, che non prevede una swap, e che mette la directory per EFI in una partizione in coda al disco, cosa che rende più complicata l'espansione dello stesso, oppure l'uso del filesystem @ext4@, che si potrebbe voler sostituire con @btrfs@ o @xfs@. Inoltre la configurazione della rete nell'immagine si appoggia a @netplan@, che non è detto si voglia utilizzare rispetto allo standard delle installazioni ordinarie (la configurazione in @/etc/network/interfaces@). Vedremo allora come si può creare una immagine personalizzata per l'uso con di @cloud-init@ a partire da una installazione ordinaria di Debian. In questo caso assumeremo che si sia installata su Proxmox una macchina virtuale con Debian a partire dal CD per l'insallazione via rete (il cosiddetto @netinst@). Per i dettagli di questa modalità di installazione si rimanda a quanto trattato in [[Installare una VM Debian su Proxmox|questo articolo]], in cui se ne illustrano tutti i passi. Assumeremo che l’installazione sia stata fatta nella maniera illustrata nell'articolo citato, ricordando che è in quella fase che è possibile cambiare le modalità di partizionamento del disco e l'eventuale filesystem di installazione. Le scelte specifiche che si dovranno fare in fase di installazione di Debian sono: * si imposti per @root@ una password provvisoria per l'accesso, la si potrà rimuovere in seguito, e reimpostare con @cloud-init@ * si crei un utente ordinario: @debian@ (o altro, andrà comunque cancellato) * si configuri la rete nella maniera più semplice per poter accedere sulla macchina (anche usando un eventuale DHCP), poi verrà gestita da @cloud-init@ * si scelga il partizionamento manuale del disco, su cui: ** creare una prima partizione primaria di circa 4G come swap ** creare una eventuale seconda partizione primaria se si vuole usare EFI (non necessaria con i default per il bios virtuale di Proxmox) ** creare una ultima partizione primaria con resto del disco da usare come radice * si scelga nella schermata di "Selezione del software" solo "Server SSH " e "Utilità di sistema standard" (il resto si installerà dopo). In questo modo si avrà un disco partizionato in modo da avere la partizione di sistema in coda al disco, cosa che ne consente una facile espansione, permettendo a @cloud-init@ di allargarla automaticamente una volta che si sia allargato il disco dall'interfaccia di Proxmox. Completata l’installazione di base si potrà passare a preparare l'immagine del server. Dato che l’installazione di default blocca l’accesso in SSH a @root@ con la password, o si usa l’utente ordinario @debian@ creato in fase di installazione e poi @su@ o @sudo@, o ci si collega a @root@ sulla console via web. Tutte le operazioni seguenti sono da eseguirsi collegati come @root@, se le si vogliono effettuare passando da una connessione SSH occorrerà abilitare da subito l’accesso a @root@ anche con le password, inserendo dentro @/etc/ssh/sshd_config.d/root.conf@: <pre> # enable root password access PermitRootLogin yes </pre> e riavviare @sshd@ con @service ssh restart@. Non è necessario configurare in questa fase l’uso di chiavi SSH, queste possono essere impostate in qualunque momento successivo tramite @cloud-init@. Una volta che ci si sia ricollegati con successo usando direttamente @root@ (dalla console o SSH), @root@, si potrà cancellare l'utente @debian@ usato per l'accesso iniziale che non serve più: e la relativa configurazione in @/etc/sudoers.d/@ con: <pre> userdel -r debian </pre> A questo punto si potrà installare il pacchetto @cloud-init@, e configurare il programma. Dato che questo di default impiega @resolvconf@ per la configurazione della rete sarà necessario installare anche questo pacchetto, con: <pre> rm /etc/sudoers.d/debian-cloud-init /etc/sudoers.d/90-cloud-init-users apt install cloud-init resolvconf </pre> Si tenga conto che Su Buster inoltre, per poterli installare la rete deve essere accessibile quindi la macchina deve essere stata configurata correttamente per avere un gateway di uscita, ed inoltre occorre avere un default per il DNS (che deve esser stato impostato, a meno di non avere un DHCP sulla rete che configura le interfacce, durante l'installazione). In generale si potrà sempre impostare un server DNS valido manualmente in @/etc/resolv.conf@ con un comando come @echo nameserver 1.1.1.1 > /etc/resolv.conf@. Come nel caso precedente occorrerà impostare la configurazione di @cloud-init@ per mantenere l'accesso diretto a @root@. Inoltre avendo eliminato l'utente ordinario @debian@, per evitare che venga ricreato ad ogni riavvio, come previsto nel default della configurazione, occorre anche disabilitarne l'uso. Tutto questo potrà essere fatto aggiungendo un file @/etc/cloud/cloud.cfg.d/99_local.cfg@ con un contenuto come: l'uso nella configurazione di cloud-init in @/etc/cloud/cloud.cfg@ commentando le ultime due delle righe seguenti: <pre> # If this is set, 'root' will not be able to ssh in and they # will get a message to login instead as the above $user (debian) disable_root: false # A set of users which may be applied and/or used by various modules # when a 'default' entry is found it will reference the 'default_user' # from the distro configuration specified below users: #users: # - root default </pre> dove di nuovo si blocca la disabilitazione di @root@ e si indica quest'ultimo come utente da creare. Infine andrà modificato il l'immagine scaricata contiene un file @/etc/network/interfaces@ che cerca di effettuare una configurazione delle interfacce in DHCP di rete @/etc/network/interfaces@ per evitare @eth0@ ed eventuali altre interfacce, che le voci inserite durante l'installazione interferiscano con quelle generate da @cloud-init@, deve andare in timeout prima che di default usa per venga utilizzata la configurazione il file creata via @cloud-init@ in @50-cloud-init.cfg@ sotto @/etc/network/interfaces.d/@. In particolare va rimossa @/etc/network/interfaces.d/50-cloud-init.cfg@. Inoltre la lettura della configurazione di tutte le interfacce di rete presenti in @/etc/network/interfaces@, tranne @lo@ (l'interfaccia di loopback per aggiuntiva viene fatta prima delle ulteriori configurazioni, con il localhost), risultato che va spostata queste (in particolare quella per @lo@) sovrascrivono quanto in cima al file perché non sovrascriva quella di @cloud-init@ che imposta su questa interfaccia i essa contenuto (nel caso l'impostazione dei server DNS con @resolvconf@. In sostanza @/etc/network/interfaces@ dovrà essere qualcosa del tipo: @resolvconf@). Per questo occorre modificarne il contenuto in modo che il file contenga soltanto: <pre> # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback source /etc/network/interfaces.d/* </pre> Una volta fatto questo si potrà procedere a creare l'immagine ISO per inoltre dato che il contenuto generato in @/etc/network/interfaces.d/50-cloud-init.cfg@ imposta i DNS con la gestione dei dati di @cloud-init@ da parte di Proxmox come nel caso precedente, con direttiva @dns-nameservers@, perché abbia effetto deve essere installato @resolvconf@, che invece non è presente e deve essere inserito nell'immagine con: <pre> qm set 4242 --ide2 local-lvm:cloudinit apt install resolvconf </pre> e si potrà provare ad impostare di nuovo i parametri della rete dall'interfaccia di Proxmox, Si tenga conto che per poi avviare poterlo installare la rete deve essere accessibile quindi la macchina deve essere stata configurate correttamente per verificarne avere un gateway di uscita, ed inoltre, avendo l'immagine come default per il funzionamento. h2. Personalizzazione dell'immagine, creazione ed uso DNS (che viene mantenuto, a meno di non avere un template Qualunque DHCP sulla rete che configura le interfacce) @120.0.0.1@ in @resolv.conf@, senza che il relativo servizio sia la modalità disponibile, si dovrà impostare un server DNS valido manualmente in @/etc/resolv.conf@ (ad esempio con cui @echo nameserver 1.1.1.1 > /etc/resolv.conf@). A questo punto si sia realizzata l'immagine @cloud-init@, una volta che si è collegati alla stessa si potranno effettuare eventuali altre ulteriori personalizzazioni della macchina prima di trasformarla che poi trasformeremo in template, come l'installazione di pacchetti aggiuntivi, creazione di utenti (questi potrebbero comunque essere gestiti anche tramite @cloud-init@), cloud-init), cambi di configurazione, ecc. Una volta completate configurazione. Completate le personalizzazioni occorrerà ripulire l’immagine da tutti i dati spuri, cancellare si ricordi di eliminare ogni rimasuglio, pulire la cache di APT, svuotare i file di log, ecc. Per questo si sconnetta e ci si riconnetta (sempre come @root@) eseguendo il comando: Un possibile esempio di operazioni di pulizia potrebbero essere le seguenti: <pre> # set +o history </pre> per disabilitare la history, che cancelleremo insieme a tutto il resto, eseguendo i comandi: <pre> > .bash_history apt clean find /etc -name "*~" -delete journalctl --rotate journalctl --vacuum-time=1s fstrim / cd /var/log/ > syslog > auth.log > cloud-init.log > cloud-init-output.log > debug > dpkg.log > messages > kern.log > user.log > daemon.log > installer/syslog > wtmp > btmp </pre> A questo punto Infine si può fermare fermi la macchina virtuale ed una virtuale. Una volta tolte le impostazioni aggiunte nella sezione _Cloud-Init_ aggiunte tolta la configurazione della rete aggiunta per poterla personalizzare, la si potrà trasformare in template dall'interfaccia web o con il comando: <pre> qm template 4242 </pre> A questo punto si se ne potranno generare delle nuove macchine virtuali a partire dal template creando un clone, o dall'interfaccia web o con il comando: <pre> qm clone 4242 308 --name nuovavm test </pre> A questo punto potremo da riconfigurare a piacere per l'uso delle risorse sia via web (reimpostando RAM e dimensione del disco dalla sezione _Hardware_) che da linea di comando con qualcosa del tipo: <pre> qm resize 308 scsi0 50G qm set 308 --memory 2048 1024 </pre> e poi impostandone le caratteristiche pilotate da @cloud-init@, sia via web (dalla sezione _Cloud-Init_) che da riga di comando con qualcosa del tipo: <pre> qm set 308 --ipconfig0 ip=192.168.XX.YY/24,gw=192.168.XX.1 </pre> si potranno inoltre installare ulteriori chiavi SSH con: <pre> qm set 308 --sshkey elencochiavissh.pub </pre> dove @elencochiavissh.pub@ è un file contenente un elenco di chiavi pubbliche (una per riga) che verranno abilitate per la macchina in questione (lo si può generare da una serie un elenco di file di chiavi con un comando qualcosa tipo @cat *.pub > elencochiavissh.pub@).