Architettura e Contratto di Esecuzione
penguins-chef esegue ricette autonome attraverso una pipeline rigorosa, deterministica e verificabile. A differenza dei gestori di configurazione tradizionali basati su checkpoint astratti, chef interroga sempre lo stato reale del sistema vivo prima e dopo ogni operazione.
⚙️ Il Contratto di Esecuzione in 8 passi
Ogni volta che viene invocato chef apply, il motore attraversa otto fasi sequenziali:
- Read & Select (Lettura e Selezione): Analizza lo schema YAML della ricetta (risolvendo ricorsivamente eventuali direttive
include) e seleziona il profilo corrispondente alla famiglia della distribuzione ospite (o a quella indicata con--family). - Validate Profile (Validazione): Verifica la coerenza sintattica e strutturale di tutte le definizioni prima di apportare qualsiasi modifica al sistema.
- Configure Repositories (Repository): Aggiunge i file di repository dichiarati (es.
.listo.sourcesper APT) e aggiorna gli indici del gestore pacchetti. - Pre-check Packages (Verifica preliminare): Controlla che tutti i pacchetti richiesti esistano effettivamente nei repository configurati prima di avviare l'installazione, prevenendo transazioni lasciate a metà.
- Atomic Transaction (Transazione pacchetti): Ispeziona i pacchetti già presenti sul sistema, installa esclusivamente quelli mancanti in un'unica transazione nativa e verifica l'esito per ciascun pacchetto.
- Deploy Configuration Files (File di configurazione): Confronta, scrive in modo atomico (tramite file temporaneo e rinomina nella stessa directory, con permessi predefiniti
0644) e verifica i file di configurazione. Per sicurezza, le destinazioni che puntano a symlink vengono rigorosamente rifiutate. - Manage Hostname (Gestione nome host): Quando dichiarato nella ricetta o nel costume, imposta e verifica l'hostname di sistema aggiornando atomicamente
/etc/hostsper la risoluzione locale in loopback. - Manage Services & Sysroot (Servizi e Overlay): Abilita e verifica i servizi di avvio (senza avviarli forzatamente durante il provisioning) e sincronizza la directory
sysroot/preservando permessi e metadati, senza mai cancellare file preesistenti sul sistema.
Nota sull'idempotenza: Rieseguire
sudo chef applycon la stessa ricetta è un'operazione idempotente. Il motore rileva che pacchetti, file e servizi sono già conformi allo stato desiderato senza ripetere operazioni ridondanti.
🌍 Famiglie Supportate e Gestori Pacchetti
penguins-chef disaccoppia la definizione logica della ricetta dai comandi specifici di ciascuna famiglia Linux:
| Famiglia | Distribuzioni | Gestore Pacchetti | Preparazione e Verifica |
|---|---|---|---|
debian | Debian, Ubuntu, Linux Mint, Devuan | apt-get / dpkg | Aggiorna con apt-get update --error-on=any, verifica disponibilità con apt-cache policy e stato con dpkg-query. |
archlinux | Arch Linux, Manjaro | pacman | Sincronizza con pacman -Syu --noconfirm (evitando partial upgrade), verifica con pacman -Si e installa con pacman -S --needed. |
fedora | Fedora | dnf (incluso DNF5) | Aggiorna cache con dnf --refresh makecache, interroga disponibilità con dnf repoquery --available e installa con dnf install -y. |
opensuse | openSUSE Tumbleweed / Leap | zypper / rpm | Aggiorna con zypper --non-interactive refresh, ricerca esatta XML nei repository e verifica installazione tramite rpm. |
⚡ Gestione dell'Init System: la regola dei 2 casi
Nello sviluppo di penguins-chef è stata eliminata ogni complessità artificiale legata al sistema di init. Il panorama reale delle distribuzioni supportate si riassume in due soli casi:
systemd(Standard predefinito): Utilizzato da Arch Linux, Fedora, openSUSE, Debian, Ubuntu e Manjaro. I servizi vengono abilitati e verificati tramitesystemctl(is-enabled/enable) e il target predefinito tramitesystemctl set-default(es.graphical.target).sysvinit(Devuan): L'eccezione storica non-systemd supportata nativamente. Su Devuan, gli script in/etc/init.dvengono configurati direttamente da APT durante l'installazione dei pacchetti; i pacchetti specifici di systemd (comesystemd-timesyncdosystemd-resolved) e le chiamate asystemctlvengono esclusi automaticamente dal motore per garantire zero attriti.
Rilevamento diretto a runtime (sd_booted)
Non è mai necessario specificare un parametro --init:
- Sulla macchina reale,
chefcontrolla direttamente l'esistenza della directory/run/systemd/system: se è presente usasystemd, altrimenti adottasysvinit. - In simulazione cross-family (
--dry-run --family ...), ogni famiglia adotta automaticamente il proprio init nativo (systemdper Arch, Fedora, openSUSE, Debian;sysvinitper Devuan).