Progetto

Generale

Profilo

ProxmoxDebianCloudInit » Cronologia » Versione 17

Simone Piccardi, 14-05-2024 16:47

1 1 Simone Piccardi
h1. Debian su Proxmox con cloud-init
2
3 15 Simone Piccardi
"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. 
4 1 Simone Piccardi
5 15 Simone Piccardi
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 creare una immagine di sistema operativo pronta all'uso.
6 1 Simone Piccardi
7 15 Simone Piccardi
h2. Uso di una immagine predisposta
8
9
Una possibile scelta per l'uso da parte di Proxmox, è quella di scaricare una immagine pronta per il cloud di Debian. Sono disponibili infatti delle versioni non ufficiali a partire scaricabili a partire da https://cloud.debian.org/images/cloud/; in particolare per Proxmox servono quelle denominate @genericloud@. Dato che le immagini non sono ufficiali, sono generati periodicamente, e di dovranno cercare nella opportuna sottodirectory, ad esempio quelle per Debian 12 Bookworm si dovranno scaricare dalla opportun sottodirectory scegliendo in genere quella generata per ultima, in sostanza da https://cloud.debian.org/images/cloud/bookworm/latest. 
10
11
Per l'uso da parte di Proxmox occorrerà selezionare quella per amd64; si può prendere sia quella nel formato raw che nel formato 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:
12
13 1 Simone Piccardi
<pre>
14 15 Simone Piccardi
wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-arm64.qcow2
15 1 Simone Piccardi
</pre>
16 2 Simone Piccardi
17 15 Simone Piccardi
insieme all'immagine si scarichi il file con le relative checksum:
18 1 Simone Piccardi
19 2 Simone Piccardi
<pre>
20 15 Simone Piccardi
wget https://cloud.debian.org/images/cloud/bookworm/latest/SHA512SUMS
21 3 Simone Piccardi
</pre>
22
23 15 Simone Piccardi
e si passi a verificare il tutto con il comando:
24 14 Simone Piccardi
25 3 Simone Piccardi
<pre>
26
sha512sum -c SHA512SUMS --ignore-missing 
27 14 Simone Piccardi
</pre>
28 3 Simone Piccardi
29 14 Simone Piccardi
Come primo passo occorre creare una macchina 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:
30 3 Simone Piccardi
31
<pre>
32 17 Simone Piccardi
qm create 4242 --memory 1024 --net0 virtio,bridge=vmbr0 # --net1 virtio,bridge=vmbr1 #,  etc.
33 3 Simone Piccardi
</pre>
34
35
poi si potrà ottenere il disco della nostra importando nello storage 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:
36
37
<pre>
38 16 Simone Piccardi
root@proxmox ~ # qm importdisk 4242 debian-12-genericcloud-arm64.qcow2 local-lvm
39
importing disk 'debian-12-genericcloud-arm64.qcow2' to VM 4242 ...
40 1 Simone Piccardi
  Logical volume "vm-4242-disk-0" created.
41 16 Simone Piccardi
transferred 0.0 B of 2.0 GiB (0.00%)
42
transferred 20.5 MiB of 2.0 GiB (1.00%)
43
...
44
transferred 2.0 GiB of 2.0 GiB (100.00%)
45
Successfully imported disk as 'unused0:local-lvm:vm-4242-disk-0'
46 3 Simone Piccardi
</pre>
47
48 14 Simone Piccardi
(si usi al posto di @local-lvm@ un eventuale altro tipo di 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:
49 3 Simone Piccardi
50
 <pre>
51
root@proxmox ~ # qm set 4242 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-4242-disk-0,discard=on
52 4 Simone Piccardi
update VM 4242: -scsi0 local-lvm:vm-4242-disk-0,discard=on -scsihw virtio-scsi-pci
53 3 Simone Piccardi
</pre>
54
55
(si ometta il @,discard=on@ se lo storage utilizzato non supporta l'uso di discard). 
56
57 4 Simone Piccardi
Si potranno poi impostare le ulteriori caratteristiche della macchina virtuale per l'uso di @cloud-init@ con:
58 1 Simone Piccardi
59 4 Simone Piccardi
<pre>
60
qm set 4242 --ide2 local-lvm:cloudinit
61
qm set 4242 --boot c --bootdisk scsi0
62
qm set 4242 --serial0 socket --vga serial0
63
</pre>
64
65 14 Simone Piccardi
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 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@.
66 4 Simone Piccardi
67
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.
68
69
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@ID.DE.LA.MACCHINA@ e poi eseguire @sudo -s@ per ottenere una shell di root.
70
71 6 Simone Piccardi
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, eliminando l'utente superfluo.
72 4 Simone Piccardi
73 6 Simone Piccardi
Per far questo una volta collegati e ottenuta la shell di @root@ il primo passo sarà quello modificare la configurazione di @cloud-init@ in @/etc/cloud/cloud.cfg@, modificando la riga con @disable_root@ da @true@ a @false@ (il file è in formato YML) in modo che questo diventi:
74 4 Simone Piccardi
 
75
<pre>
76
# If this is set, 'root' will not be able to ssh in and they
77
# will get a message to login instead as the above $user (debian)
78
disable_root: false
79
</pre>
80
81
inoltre occorrerà eliminare dall'@authorized_keys@ di root il prefisso che ne blocca l'accesso, cancellando tutta la parte:
82
83
<pre>
84
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"
85
</pre>
86
87 1 Simone Piccardi
lasciando solo i dati della chiave a partire da @ssh-rsa@; si verifichi poi il funzionamento della modifica eseguendo un accesso diretto collegandosi con @ssh root@ID.DE.LA.MACCHINA@.
88
89
Una volta che ci si sia ricollegati con successo usando direttamente @root@, si potrà cancellare l'utente @debian@ usato per l'accesso e la relativa configurazione in @/etc/sudoers.d/@ con:
90
91
<pre>
92
userdel -r debian
93
rm /etc/sudoers.d/debian-cloud-init /etc/sudoers.d/90-cloud-init-users
94
</pre>
95
96 14 Simone Piccardi
Su Buster inoltre, per evitare che venga ricreato ad ogni riavvio, occorre anche disabilitarne l'uso nella configurazione di cloud-init in @/etc/cloud/cloud.cfg@ commentando le ultime due delle righe seguenti:
97 4 Simone Piccardi
98 8 Simone Piccardi
<pre>
99 14 Simone Piccardi
# A set of users which may be applied and/or used by various modules
100
# when a 'default' entry is found it will reference the 'default_user'
101
# from the distro configuration specified below
102
#users:
103
#   - default
104
</pre>
105
106
Infine l'immagine scaricata contiene un file @/etc/network/interfaces@ che cerca di effettuare una configurazione in DHCP di @eth0@ ed eventuali altre interfacce, che deve andare in timeout prima che venga utilizzata la configurazione creata via @cloud-init@ in @/etc/network/interfaces.d/50-cloud-init.cfg@. Inoltre la lettura della configurazione aggiuntiva viene fatta prima delle ulteriori configurazioni, con il risultato che queste (in particolare quella per @lo@) sovrascrivono quanto in essa contenuto (nel caso l'impostazione dei server DNS con @resolvconf@). Per questo occorre modificarne il contenuto in modo che il file contenga soltanto:
107
108
<pre>
109 1 Simone Piccardi
# This file describes the network interfaces available on your system
110
# and how to activate them. For more information, see interfaces(5).
111
112
# The loopback network interface
113
auto lo
114
iface lo inet loopback
115 6 Simone Piccardi
116
source /etc/network/interfaces.d/*
117
</pre>
118
119 14 Simone Piccardi
inoltre dato che il contenuto generato in @/etc/network/interfaces.d/50-cloud-init.cfg@ imposta i DNS con la direttiva @dns-nameservers@, perché abbia effetto deve essere installato @resolvconf@, che invece non è presente e deve essere inserito nell'immagine con:
120 6 Simone Piccardi
121
<pre>
122 14 Simone Piccardi
apt install resolvconf
123 6 Simone Piccardi
</pre>
124
125 14 Simone Piccardi
Si tenga conto che per poterlo installare la rete deve essere accessibile quindi la macchina deve essere stata configurate correttamente per avere un gateway di uscita, ed inoltre, avendo l'immagine come default per il DNS (che viene mantenuto, a meno di non avere un DHCP sulla rete che configura le interfacce) @120.0.0.1@ in @resolv.conf@, senza che il relativo servizio sia disponibile, si dovrà impostare un server DNS valido manualmente in @/etc/resolv.conf@ (ad esempio con @echo nameserver 1.1.1.1 > /etc/resolv.conf@). 
126 6 Simone Piccardi
127 14 Simone Piccardi
A questo punto si potranno effettuare eventuali altre ulteriori personalizzazioni della macchina che poi trasformeremo in template, come l'installazione di pacchetti aggiuntivi, creazione di utenti (questi potrebbero comunque essere gestiti anche tramite cloud-init), cambi di configurazione. Completate le personalizzazioni si ricordi di eliminare ogni rimasuglio, pulire la cache di APT, svuotare i file di log, ecc. Un possibile esempio di operazioni di pulizia potrebbero essere le seguenti:
128 11 Simone Piccardi
129
<pre>
130
apt clean
131
cd /var/log/
132
> syslog
133
> auth.log
134
> cloud-init.log
135
> cloud-init-output.log
136
> debug
137
> dpkg.log
138
> messages
139
> kern.log
140
> user.log
141
> daemon.log
142
</pre>
143
144
Infine si fermi la macchina virtuale. Una volta tolta la configurazione della rete aggiunta per poterla personalizzare, la si potrà trasformare in template dall'interfaccia web o con il comando:
145 6 Simone Piccardi
146
<pre>
147
qm template 4242
148
</pre>
149
150
A questo punto se ne potranno generare delle nuove macchine virtuali creando un clone, o dall'interfaccia web o con il comando:
151
152
<pre>
153
qm clone 4242 308 --name test
154
</pre>
155
156
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:
157
158
<pre>
159 8 Simone Piccardi
qm resize 308 scsi0 50G
160 6 Simone Piccardi
qm set 308 --memory 1024
161
</pre>
162
163
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:
164
165
<pre>
166 7 Simone Piccardi
qm set 308 --ipconfig0 ip=192.168.XX.YY/24,gw=192.168.XX.1
167 1 Simone Piccardi
</pre>
168 9 Simone Piccardi
169
si potranno inoltre installare ulteriori chiavi SSH con:
170
171
<pre>
172
qm set 308 --sshkey elencochiavissh.pub
173
</pre>
174
175 10 Simone Piccardi
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 un elenco di file di chiavi con qualcosa tipo @cat *.pub > elencochiavissh.pub@).