|
| 1 | +--- |
| 2 | +title: 3. Il motore di configurazione |
| 3 | +author: Wale Soyinka |
| 4 | +contributors: Steven Spencer |
| 5 | +tags: |
| 6 | + - cloud-init |
| 7 | + - rocky linux |
| 8 | + - cloud-init modules |
| 9 | + - automation |
| 10 | +--- |
| 11 | + |
| 12 | +## Approfondimento sui moduli cloud-init |
| 13 | + |
| 14 | +Nell'ultimo capitolo, si è avviato con successo un'immagine cloud e si è eseguito una semplice personalizzazione. Sebbene efficace, il vero potere, la portabilità e l'idempotenza di `cloud-init` si sbloccano attraverso il suo sistema di moduli. Questi moduli sono strumenti specializzati del toolkit `cloud-init`, progettati per gestire attività di configurazione specifiche in modo dichiarativo e prevedibile. |
| 15 | + |
| 16 | +Questo capitolo approfondisce il sistema dei moduli, spiegando cosa sono, come funzionano e come utilizzare quelli più essenziali per costruire un server ben configurato. |
| 17 | + |
| 18 | +## 1. L'anatomia della configurazione |
| 19 | + |
| 20 | +### Cosa sono i moduli cloud-init |
| 21 | + |
| 22 | +Un modulo `cloud-init` è uno script Python specializzato progettato per gestire una singola attività di provisioning discreta. Considerarli come plugin per attività quali la gestione degli utenti, l'installazione di pacchetti o la scrittura di file. |
| 23 | + |
| 24 | +Il vantaggio principale dell'utilizzo dei moduli rispetto ai semplici script (come `runcmd`) è l'**idempotenza**. Un'operazione idempotente produce lo stesso risultato sia che venga eseguita una volta o dieci volte. Quando dichiari che un utente dovrebbe esistere, il modulo garantisce che tale condizione sia soddisfatta: creerà l'utente se non esiste, ma non farà nulla se esiste già. Questo rende le tue configurazioni affidabili e ripetibili. |
| 25 | + |
| 26 | +### Il formato `#cloud-config` rivisitato |
| 27 | + |
| 28 | +Quando `cloud-init` rileva l'intestazione `#cloud-config`, interpreta il file come un insieme di istruzioni in formato YAML: le chiavi di primo livello in questo file YAML corrispondono direttamente ai moduli `cloud-init`. |
| 29 | + |
| 30 | +### Esecuzione e ordine dei moduli |
| 31 | + |
| 32 | +I moduli vengono eseguiti in fasi specifiche del processo di avvio in una sequenza definita in `/etc/cloud/cloud.cfg`. Una visione semplificata di questo flusso è la seguente: |
| 33 | + |
| 34 | +``` |
| 35 | +System Boot |
| 36 | + | |
| 37 | + +--- Stage: Generator (Very early boot) |
| 38 | + | `--- cloud_init_modules (e.g., migrator) |
| 39 | + | |
| 40 | + +--- Stage: Local (Pre-network) |
| 41 | + | `--- (Modules for local device setup) |
| 42 | + | |
| 43 | + +--- Stage: Network (Network is up) |
| 44 | + | `--- cloud_config_modules (e.g., users-groups, packages, write_files) |
| 45 | + | |
| 46 | + `--- Stage: Final (Late boot) |
| 47 | + `--- cloud_final_modules (e.g., runcmd, scripts-user) |
| 48 | +``` |
| 49 | + |
| 50 | +L'ordine è fondamentale. Ad esempio, il modulo `users-groups` viene eseguito prima di `runcmd`, garantendo che uno script possa essere eseguito da un utente appena creato nella stessa configurazione. |
| 51 | + |
| 52 | +!!! tip "Personalizzazione del comportamento di `cloud-init`" |
| 53 | + |
| 54 | + Sebbene il file `/etc/cloud/cloud.cfg` definisca il comportamento predefinito, non si dovrebbe mai modificarlo direttamente. Per personalizzazioni permanenti a livello di sistema, inserire i vostri file `.cfg` nella directory `/etc/cloud/cloud.cfg.d/`. Questa è la pratica standard per la creazione di immagini personalizzate, che approfondiremo in un capitolo successivo. |
| 55 | + |
| 56 | +## 2. Moduli ad alta utilità: i drivers quotidiani |
| 57 | + |
| 58 | +Mettiamoci all'opera con i moduli più comuni utilizzando il metodo di iniezione diretta con `virt-install`. |
| 59 | + |
| 60 | +### Approfondimento sul modulo: `users` e `groups` |
| 61 | + |
| 62 | +Una corretta gestione degli account utente è fondamentale per garantire la sicurezza di una nuova istanza server. Il modulo `users` è lo strumento principale per farlo, che ti permette di creare nuovi utenti, modificare quelli esistenti, gestire le appartenenze ai gruppi e, soprattutto, inserire chiavi SSH per facilitare accessi sicuri e senza password fin dal primo avvio. |
| 63 | + |
| 64 | +**Esempio 1: Creazione di un nuovo utente amministratore** |
| 65 | + |
| 66 | +In questo esempio, provvederemo a fornire un nuovo utente amministratore dedicato denominato `sysadmin`. Concederemo a questo utente funzionalità `sudo` senza password aggiungendolo al gruppo `wheel` e fornendo una regola `sudo` specifica. Inseriremo anche una chiave pubblica SSH per garantire un accesso sicuro. |
| 67 | + |
| 68 | +1. **Creare `user-data.yml`:** |
| 69 | + |
| 70 | + ```bash |
| 71 | + cat <<EOF > user-data.yml |
| 72 | + #cloud-config |
| 73 | + users: |
| 74 | + - name: sysadmin |
| 75 | + groups: [ wheel ] |
| 76 | + sudo: [ "ALL=(ALL) NOPASSWD:ALL" ] |
| 77 | + shell: /bin/bash |
| 78 | + ssh_authorized_keys: |
| 79 | + - <YOUR_SSH_PUBLIC_KEY_HERE> |
| 80 | + EOF |
| 81 | + ``` |
| 82 | +
|
| 83 | +2. **Spiegazione delle direttive chiave:** |
| 84 | +
|
| 85 | + - `name`: Il nome utente per il nuovo account. |
| 86 | + - `gruppi`: un elenco di gruppi a cui aggiungere l'utente. Su Rocky Linux, l'appartenenza al gruppo `wheel` è comunemente utilizzata per concedere diritti amministrativi. |
| 87 | + - `sudo`: un elenco di regole `sudoers` da applicare. La regola `ALL=(ALL) NOPASSWD:ALL` consente all'utente di eseguire qualsiasi comando con `sudo` senza richiedere la password. |
| 88 | + - `ssh_authorized_keys`: un elenco di chiavi SSH pubbliche da aggiungere al file `~/.ssh/authorized_keys` dell'utente. |
| 89 | +
|
| 90 | +3. **Avvio e verifica:** avvia la VM con questi `user-data`. Si dovrebbe essere in grado di eseguire SSH come `sysadmin` ed eseguire comandi `sudo`. |
| 91 | +
|
| 92 | +**Esempio 2: Modifica dell'utente predefinito** |
| 93 | +
|
| 94 | +Un'operazione più comune consiste semplicemente nel proteggere l'utente predefinito fornito con l'immagine cloud (`rocky`). Qui modificheremo questo utente per aggiungere la nostra chiave SSH. |
| 95 | +
|
| 96 | +1. **Creare `user-data.yml`:** |
| 97 | +
|
| 98 | + ```bash |
| 99 | + cat <<EOF > user-data.yml |
| 100 | + #cloud-config |
| 101 | + users: |
| 102 | + - default |
| 103 | + - name: rocky |
| 104 | + ssh_authorized_keys: |
| 105 | + - <YOUR_SSH_PUBLIC_KEY_HERE> |
| 106 | + EOF |
| 107 | + ``` |
| 108 | +
|
| 109 | +2. **Spiegazione delle direttive chiave:** |
| 110 | +
|
| 111 | + - `default`: questa voce speciale indica a `cloud-init` di eseguire prima la configurazione utente predefinita. |
| 112 | + - `name: rocky`: Specificando il nome di un utente esistente, il modulo modificherà quell'utente invece di crearne uno nuovo. Qui, unisce la chiave SSH fornita all'account dell'utente `rocky`. |
| 113 | +
|
| 114 | +3. **Avvio e verifica:** avviare la VM. Ora è possibile eseguire SSH come utente `rocky` senza password. |
| 115 | +
|
| 116 | +### Approfondimento sul modulo: `packages` |
| 117 | +
|
| 118 | +Il modulo `packages` offre un modo dichiarativo per gestire il software sulla vostra istanza, assicurando l'installazione di applicazioni specifiche all'avvio. |
| 119 | +
|
| 120 | +In questo esempio, provvederemo all'installazione di due strumenti utili, `nginx` (un server web ad alte prestazioni) e `htop` (un visualizzatore di processi interattivo). Inoltre, istruiremo `cloud-init` ad aggiornare prima i metadati del repository dei pacchetti per garantire che possa trovare le versioni più recenti. |
| 121 | +
|
| 122 | +1. **Creare `user-data.yml`:** |
| 123 | +
|
| 124 | + ```bash |
| 125 | + cat <<EOF > user-data.yml |
| 126 | + #cloud-config |
| 127 | + package_update: true |
| 128 | + packages: |
| 129 | + - nginx |
| 130 | + - htop |
| 131 | + EOF |
| 132 | + ``` |
| 133 | +
|
| 134 | +2. **Spiegazione delle direttive chiave:** |
| 135 | +
|
| 136 | + - `package_update: true`: indica al gestore dei pacchetti di aggiornare i propri metadati locali. Su Rocky Linux, ciò equivale a eseguire `dnf check-update`. |
| 137 | + - `packages`: un elenco dei nomi dei pacchetti da installare. |
| 138 | +
|
| 139 | +3. **Avvio e verifica:** dopo l'avvio, eseguire l'accesso SSH e verificare l'installazione di `nginx` con `rpm -q nginx`. |
| 140 | +
|
| 141 | +!!! note "Idempotenza in azione" |
| 142 | +
|
| 143 | + Se si dovesse riavviare questa VM con gli stessi `user-data`, il modulo `packages` vedrebbe che `nginx` e `htop` sono già installati e non farebbe nulla. Ciò garantisce lo stato desiderato (i pacchetti sono presenti) senza intraprendere azioni inutili. Questa è l'idempotenza. |
| 144 | +
|
| 145 | +### Approfondimento sul modulo: `write_files` |
| 146 | +
|
| 147 | +Questo modulo è incredibilmente versatile e consente di scrivere qualsiasi contenuto di testo su qualsiasi file presente nel sistema. È lo strumento perfetto per distribuire file di configurazione delle applicazioni, popolare contenuti web o creare script di supporto. |
| 148 | +
|
| 149 | +Per dimostrarne la potenza, useremo `write_files` per creare una homepage personalizzata per il server web `nginx` che installeremo nella stessa sessione. |
| 150 | +
|
| 151 | +1. **Creare `user-data.yml`:** |
| 152 | +
|
| 153 | + ```bash |
| 154 | + cat <<EOF > user-data.yml |
| 155 | + #cloud-config |
| 156 | + packages: [nginx] |
| 157 | + write_files: |
| 158 | + - path: /usr/share/nginx/html/index.html |
| 159 | + content: '<h1>Hello from cloud-init!</h1>' |
| 160 | + owner: nginx:nginx |
| 161 | + permissions: '0644' |
| 162 | + runcmd: |
| 163 | + - [ systemctl, enable, --now, nginx ] |
| 164 | + EOF |
| 165 | + ``` |
| 166 | +
|
| 167 | +2. **Spiegazione delle direttive chiave:** |
| 168 | +
|
| 169 | + - `path`: Il percorso assoluto sul filesystem dove il file verrà scritto. |
| 170 | + - `content`: Il contenuto testuale da scrivere nel file. |
| 171 | + - `owner`: specifica l'utente e il gruppo che devono essere proprietari del file (ad esempio, `nginx:nginx`). |
| 172 | + - `permissions`: i permessi del file in formato ottale (ad esempio, `0644`). |
| 173 | +
|
| 174 | +3. **Avvio e verifica:** dopo l'avvio, accedi tramite SSH e utilizza `curl localhost` per visualizzare la nuova homepage. |
| 175 | +
|
| 176 | +!!! tip "Scrittura di file binari" |
| 177 | +
|
| 178 | + Il modulo `write_files` non è limitato al testo. Specificando un `encoding`, è possibile distribuire file binari. Ad esempio, è possibile utilizzare `encoding: b64` per scrivere dati codificati in base64. Per casi d'uso avanzati, fare riferimento alla [documentazione ufficiale di `write_files`](https://cloudinit.readthedocs.io/en/latest/topics/modules.html#write-files). |
| 179 | +
|
| 180 | +## Prossimo passo |
| 181 | +
|
| 182 | +Ora si è appreso i tre moduli fondamentali di `cloud-init`. Combinandoli, è possibile eseguire una quantità significativa di configurazioni automatizzate del server. Nel prossimo capitolo affronteremo scenari più avanzati, tra cui la configurazione di rete e la combinazione di diversi formati di `dati utente` in un unico processo. |
0 commit comments