|
| 1 | +--- |
| 2 | +title: 4. Provisioning avanzato |
| 3 | +author: Wale Soyinka |
| 4 | +contributors: Steven Spencer |
| 5 | +tags: |
| 6 | + - cloud-init |
| 7 | + - rocky linux |
| 8 | + - cloud |
| 9 | + - automation |
| 10 | + - networking |
| 11 | +--- |
| 12 | + |
| 13 | +## Networking e multi-part payload |
| 14 | + |
| 15 | +Nel capitolo precedente si è imparato a utilizzare i moduli principali di `cloud-init` per la gestione di utenti, pacchetti e file. Ora è possibile creare un server ben configurato in modo dichiarativo. Ora è il momento di esplorare tecniche più avanzate che ci consentano un controllo ancora maggiore sulla configurazione della vostra istanza. |
| 16 | + |
| 17 | +Questo capitolo tratta due argomenti avanzati e molto importanti: |
| 18 | + |
| 19 | +1. Configurazione di rete dichiarativa: come andare oltre il DHCP e definire configurazioni di rete statiche per le tue istanze. |
| 20 | +2. Payload MIME multiparte: come combinare diversi tipi di dati utente, come script di shell e file `#cloud-config`, in un unico potente payload. |
| 21 | + |
| 22 | +## 1) Configurazione per rete dichiarativa |
| 23 | + |
| 24 | +Per impostazione predefinita, la configurazione della maggior parte delle immagini cloud prevede l'acquisizione di un indirizzo IP tramite DHCP. Sebbene sia comodo, molti ambienti di produzione richiedono che i server abbiano indirizzi IP statici. Il sistema di configurazione di rete `cloud-init` offre un modo dichiarativo e indipendente dalla piattaforma per gestire tutto questo. |
| 25 | + |
| 26 | +Le specifiche delle configurazioni di rete sono contenute in un documento YAML separato dal `#cloud-config` principale. I processi `cloud-init` provengono entrambi dallo stesso file e utilizzano il separatore standard dei documenti YAML (`---`) per distinguerli. |
| 27 | + |
| 28 | +!!! note "Come `cloud-init` applica lo stato della rete" |
| 29 | + |
| 30 | + Su Rocky Linux, `cloud-init` non configura direttamente le interfacce di rete. Agisce invece come un traduttore, convertendo la sua configurazione di rete in file che **NetworkManager** (il servizio di rete predefinito) è in grado di comprendere. Quindi passa il controllo a NetworkManager per applicare la configurazione. È possibile ispezionare i profili di connessione risultanti in `/etc/NetworkManager/system-connections/`. |
| 31 | + |
| 32 | +### Esempio 1: Configurazione di un singolo IP statico |
| 33 | + |
| 34 | +In questo esercizio configureremo la macchina virtuale con un indirizzo IP statico, un gateway predefinito e server DNS personalizzati. |
| 35 | + |
| 36 | +1. **Creare `user-data.yml`:** |
| 37 | + |
| 38 | + Questo file contiene due documenti YAML distinti, separati da `---`. Il primo è il `#cloud-config` standard. Il secondo definisce lo stato della rete. |
| 39 | + |
| 40 | + ```bash |
| 41 | + cat <<EOF > user-data.yml |
| 42 | + #cloud-config |
| 43 | + # Possiamo comunque includere i moduli standard. |
| 44 | + # Installiamo uno strumento per la risoluzione dei problemi di rete. |
| 45 | + packages: |
| 46 | + - traceroute |
| 47 | + |
| 48 | + --- |
| 49 | + |
| 50 | + # Questo secondo documento definisce la configurazione di rete. |
| 51 | + network: |
| 52 | + version: 2 |
| 53 | + ethernets: |
| 54 | + eth0: |
| 55 | + dhcp4: no |
| 56 | + addresses: |
| 57 | + - 192.168.122.100/24 |
| 58 | + gateway4: 192.168.122.1 |
| 59 | + nameservers: |
| 60 | + addresses: [8.8.8.8, 8.8.4.4] |
| 61 | + EOF |
| 62 | + ``` |
| 63 | +
|
| 64 | +2. **Spiegazione delle Key directives:** |
| 65 | +
|
| 66 | + - `network:`: Chiave di primo livello per la configurazione di rete. |
| 67 | + - `versione: 2`: specifica che stiamo utilizzando la sintassi moderna, simile a Netplan. |
| 68 | + - `ethernets:`: un dizionario delle interfacce di rete fisiche da configurare, ordinate in base al nome dell'interfaccia (ad esempio, `eth0`). |
| 69 | + - `dhcp4: no`: Disabilita il DHCP per IPv4 su questa interfaccia. |
| 70 | + - `indirizzi`: un elenco di indirizzi IP statici da assegnare, specificati in notazione CIDR. |
| 71 | + - `gateway4`: Il gateway predefinito per il traffico IPv4. |
| 72 | + - `nameservers`: un dizionario contenente un elenco di indirizzi IP per la risoluzione DNS. |
| 73 | +
|
| 74 | +3. _Boot e verifica._\* |
| 75 | +
|
| 76 | + La verifica è diversa questa volta, poiché la VM non otterrà un indirizzo IP dinamico. È necessario connettersi direttamente alla console della VM. |
| 77 | +
|
| 78 | + ```bash |
| 79 | + # Utilizzare un nuovo disco per questo esercizio |
| 80 | + qemu-img create -f qcow2 -F qcow2 -b Rocky-10-GenericCloud.qcow2 static-ip-vm.qcow2 |
| 81 | + |
| 82 | + virt-install --name rocky10-static-ip \ |
| 83 | + --memory 2048 --vcpus 2 \ |
| 84 | + --disk path=static-ip-vm.qcow2,format=qcow2 \ |
| 85 | + --cloud-init user-data=user-data.yml,hostname=network-server \ |
| 86 | + --os-variant rockylinux10 \ |
| 87 | + --import --noautoconsole |
| 88 | + |
| 89 | + # Connettere la virtual console |
| 90 | + virsh console rocky10-static-ip |
| 91 | + |
| 92 | + # Loggarsi dentro e controlloare l'IP |
| 93 | + [rocky@network-server ~]$ ip a show eth0 |
| 94 | + ``` |
| 95 | +
|
| 96 | + L'output dovrebbe mostrare che `eth0` ha l'indirizzo IP statico `192.168.122.100/24`. |
| 97 | +
|
| 98 | +### Esempio 2: Configurazione multi-interfaccia |
| 99 | +
|
| 100 | +Uno scenario comune nel mondo reale è un server con più interfacce di rete. Qui creeremo una VM con due interfacce: `eth0` utilizzerà DHCP, mentre `eth1` avrà un IP statico. |
| 101 | +
|
| 102 | +1. **Create `user-data.yml` per due interfacce:** |
| 103 | +
|
| 104 | + ```bash |
| 105 | + cat <<EOF > user-data.yml |
| 106 | + #cloud-config |
| 107 | + packages: [iperf3] |
| 108 | + |
| 109 | + --- |
| 110 | + |
| 111 | + network: |
| 112 | + version: 2 |
| 113 | + ethernets: |
| 114 | + eth0: |
| 115 | + dhcp4: yes |
| 116 | + eth1: |
| 117 | + dhcp4: no |
| 118 | + addresses: [192.168.200.10/24] |
| 119 | + EOF |
| 120 | + ``` |
| 121 | +
|
| 122 | +2. **Boot di una VM con due schede di rete:** aggiungiamo un secondo flag `--network` al comando `virt-install`. |
| 123 | +
|
| 124 | + ```bash |
| 125 | + virt-install --name rocky10-multi-nic \ |
| 126 | + --memory 2048 --vcpus 2 \ |
| 127 | + --disk path=... \ |
| 128 | + --network network=default,model=virtio \ |
| 129 | + --network network=default,model=virtio \ |
| 130 | + --cloud-init user-data=user-data.yml,hostname=multi-nic-server \ |
| 131 | + --os-variant rockylinux10 --import --noautoconsole |
| 132 | + ``` |
| 133 | +
|
| 134 | +3. **Verifica:** esegure SSH all'indirizzo assegnato dal DHCP su `eth0`, quindi controlla l'IP statico su `eth1` con `ip a show eth1`. |
| 135 | +
|
| 136 | +## 2) Unificazione dei payload con MIME multi-part |
| 137 | +
|
| 138 | +A volte è necessario eseguire uno script di configurazione _prima_ dell'esecuzione dei moduli principali `#cloud-config`. I file multi-part MIME sono la soluzione ideale, poiché consentono di raggruppare diversi tipi di contenuti in un unico payload ordinato. |
| 139 | +
|
| 140 | +È possibile visualizzare la struttura di un file MIME come segue: |
| 141 | +
|
| 142 | +``` |
| 143 | ++-----------------------------------------+ |
| 144 | +| Main Header (multipart/mixed; boundary) | |
| 145 | ++-----------------------------------------+ |
| 146 | +| |
| 147 | +| --boundary | |
| 148 | +| +-------------------------------------+ |
| 149 | +| | Part 1 Header (e.g., text/x-shellscript) | |
| 150 | +| +-------------------------------------+ |
| 151 | +| | Part 1 Content (#/bin/sh...) | |
| 152 | +| +-------------------------------------+ |
| 153 | +| |
| 154 | +| --boundary | |
| 155 | +| +-------------------------------------+ |
| 156 | +| | Part 2 Header (e.g., text/cloud-config) | |
| 157 | +| +-------------------------------------+ |
| 158 | +| | Part 2 Content (#cloud-config...) | |
| 159 | +| +-------------------------------------+ |
| 160 | +| |
| 161 | +| --boundary-- (closing) | |
| 162 | ++-----------------------------------------+ |
| 163 | +``` |
| 164 | +
|
| 165 | +### Hands-on: uno script per il controllo preventivo |
| 166 | +
|
| 167 | +Creeremo un file composto da più parti che prima esegue uno script shell e poi procede al `#cloud-config` principale. |
| 168 | +
|
| 169 | +1. **Creare il file multiparte `user-data.mime`:** |
| 170 | +
|
| 171 | + Si tratta di un file di testo con un formato speciale che utilizza una stringa “di delimitazione” per separare le parti. |
| 172 | +
|
| 173 | + ```bash |
| 174 | + cat <<EOF > user-data.mime |
| 175 | + Content-Type: multipart/mixed; boundary="//" |
| 176 | + MIME-Version: 1.0 |
| 177 | + |
| 178 | + --// |
| 179 | + Content-Type: text/x-shellscript; charset="us-ascii" |
| 180 | + |
| 181 | + #!/bin/sh |
| 182 | + echo "Running pre-flight checks..." |
| 183 | + # In a real script, you might check disk space or memory. |
| 184 | + # If checks failed, you could 'exit 1' to halt cloud-init. |
| 185 | + echo "Pre-flight checks passed." > /tmp/pre-flight-status.txt |
| 186 | + |
| 187 | + --// |
| 188 | + Content-Type: text/cloud-config; charset="us-ascii" |
| 189 | + |
| 190 | + #cloud-config |
| 191 | + packages: |
| 192 | + - htop |
| 193 | + runcmd: |
| 194 | + - [ sh, -c, "echo 'Main cloud-config ran successfully' > /tmp/main-config-status.txt" ] |
| 195 | + |
| 196 | + --//-- |
| 197 | + EOF |
| 198 | + ``` |
| 199 | +
|
| 200 | + !!! note "Informazioni sul delimitatore MIME" |
| 201 | +
|
| 202 | + ``` |
| 203 | + La stringa di delimitazione (in questo caso `//`) è una stringa arbitraria che non deve comparire nel contenuto di nessuna parte. Viene utilizzata per separare le diverse sezioni del file. |
| 204 | + ``` |
| 205 | +
|
| 206 | +2. _Boot e verifica._\* |
| 207 | +
|
| 208 | + Questo file viene passato a `virt-install` allo stesso modo di un file `user-data.yml` standard. |
| 209 | +
|
| 210 | + ```bash |
| 211 | + # Use a new disk image |
| 212 | + qemu-img create -f qcow2 -F qcow2 -b Rocky-10-GenericCloud.qcow2 mime-vm.qcow2 |
| 213 | + |
| 214 | + virt-install --name rocky10-mime-test \ |
| 215 | + --memory 2048 --vcpus 2 \ |
| 216 | + --disk path=mime-vm.qcow2,format=qcow2 \ |
| 217 | + --cloud-init user-data=user-data.mime,hostname=mime-server \ |
| 218 | + --os-variant rockylinux10 \ |
| 219 | + --import --noautoconsole |
| 220 | + ``` |
| 221 | +
|
| 222 | + Dopo il boot, accedere alla VM tramite SSH e verificare che entrambe le parti siano state eseguite cercando i file che hanno creato: |
| 223 | +
|
| 224 | + ```bash |
| 225 | + cat /tmp/pre-flight-status.txt |
| 226 | + cat /tmp/main-config-status.txt |
| 227 | + ``` |
| 228 | +
|
| 229 | +!!! tip "Altri tipi di contenuti Multi-part" |
| 230 | +
|
| 231 | + `cloud-init` supporta altri tipi di contenuto per casi d'uso avanzati, come `text/cloud-boothook` per script iniziali di boot o `text/part-handler` per l'esecuzione di codice Python personalizzato. Per ulteriori dettagli, consultare la documentazione ufficiale. |
| 232 | +
|
| 233 | +## Prossimo passo |
| 234 | +
|
| 235 | +Ora avete imparato due potenti tecniche avanzate di `cloud-init`. Ora è possibile definire reti statiche e orchestrare flussi di lavoro di provisioning complessi con dati utente multi-part. |
| 236 | +
|
| 237 | +Nel prossimo capitolo, sposteremo la nostra prospettiva dal _consumo_ di `cloud-init` su base individuale alla _personalizzazione del suo comportamento predefinito_ per creare le vostre “immagini golden” preconfigurate. |
0 commit comments