The dual/solo autorandr profiles existed under dotfiles/nymph/ but were never deployed (no host_i3_dotfiles entry). Mirror the ikaros pattern so they land in ~/.config/autorandr/. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Infra — Personal Infrastructure as Code
Questo repository contiene la configurazione Infrastructure as Code (IaC) utilizzata per gestire e mantenere allineate diverse macchine personali tramite Ansible.
L'obiettivo è avere una singola fonte di verità per:
- configurazione delle macchine
- pacchetti installati
- servizi di sistema
- configurazioni utente (dotfiles)
Il repository consente di gestire più sistemi operativi e profili macchina mantenendo una struttura modulare, riproducibile e idempotente.
Architettura del progetto
infra/
├── ansible/
│ ├── ansible.cfg
│ ├── site.yml
│ ├── inventory/
│ │ ├── hosts.yml
│ │ ├── group_vars/
│ │ └── host_vars/
│ ├── templates/
│ └── roles/
│
├── dotfiles/
│ ├── common/
│ ├── desktop/
│ ├── fedora/
│ ├── server/
│ ├── workstation/
│ ├── ikaros/
│ └── nymph/
│
├── scripts/
├── secrets/
└── README.md
Il repository è diviso in due componenti principali:
| Componente | Scopo |
|---|---|
| ansible | provisioning e configurazione macchine |
| dotfiles | configurazioni utente versionate |
Macchine gestite
Il repository modella attualmente tre tipologie di profilo e prepara due filoni workstation: Linux nativa e Windows + WSL.
Nota sullo stato attuale del playbook principale:
ansible/site.ymlapplica oggi in automatico il profilo desktop su host Void Linuxansible/site.ymlapplica la workstation Linux nativa separando il layer dev comune dal layer host GNOMEansible/site.ymlapplica anche il ramoworkstation_host_windows+workstation_dev_wslper il modello Windows 11 + WSLansible/site.ymlapplica anche il profiloubuntu_servercon baseline apt, systemd, dotfiles server e firewall UFW
Desktop
Sistema operativo:
- Void Linux
Sessioni desktop:
ikaros: i3nymph: SwayFX
Macchine:
ikarosnymph
Queste macchine condividono la stessa configurazione base desktop e vengono mantenute allineate tramite Ansible.
Lo stato attuale del profilo desktop include, tra le altre cose:
- dotfiles comuni e desktop
- sessione i3 su
ikarose sessione Sway sunymph empttycon default host-specific per il desktop attivo su ogni host- pacchetti Void Linux e servizi runit
turnstileper i servizi utente, inclusiemacsessh-agentssh-agentcon socket stabile condiviso tra shell, SSH ed Emacs in~/.local/state/ssh-agent/socket.emacs.ddistribuito da un task dedicato Ansible con tagemacstmuxcon plugin gestiti da TPM al bootstrap del profilo desktop- Flatpak con remoto Flathub
- GNOME Keyring e bootstrap della posta via script dedicato
- shell Noctalia su Sway su
nymph, con plugin ufficiali per clipboard (clipper), polkit (polkit-agent), screenshot (screenshot) e gestione USB (usb-drive-manager); config condivisa indotfiles/desktop/.config/noctalia/esettings.jsonrenderizzato da template Ansible con variabili host-specifiche udiskiecome backend per automount/LUKS su Sway, senza tray; la UI dei dispositivi removibili è demandata ausb-drive-managerkanshisunymphper il profilo monitor Wayland, con workspace Sway deterministici: in dual monitor1resta sueDP-1e2-10vanno suDP-1, mentre in laptop-only tutti tornano sueDP-1- monitor Noctalia e
screenOverridesdichiarati in inventory (noctalia_bar_monitors,noctalia_screen_overrides) per hostnymph
Workstation
Sistemi operativi supportati:
- Ubuntu LTS nativa
- Fedora Workstation nativa
- Windows 11 host + Ubuntu WSL
Desktop environment host Linux:
- GNOME
Macchine attuali:
deadalus-ubuntucome workstation Ubuntu nativadeadalus-fedoracome workstation Fedora nativa- supporto attivo per host Windows 11 + WSL tramite
deadalus-winedeadalus-wsl
Questo profilo è pensato per sviluppo e lavoro, con separazione tra layer host e layer dev.
Nel modello Ansible usato qui, un singolo inventory host puo appartenere intenzionalmente a piu gruppi e quindi ricevere piu play nello stesso run: l'associazione non e 1 host = 1 play, ma host + gruppi = layering finale.
Il profilo workstation e agganciato al playbook principale e ora distingue:
- layer dev Ubuntu condiviso tra workstation Linux nativa e Ubuntu in WSL
- layer dev Fedora nativo parallelo a Ubuntu
- layer host Linux GNOME
- layer host Windows 11 con bootstrap WSL, remoting
PSRPsuHTTPS/5986, gestione app viawingetcon backend configurabile e VS Code lato Windows - layer WSL dedicato per sviluppo con
systemd
Per esempio, lo stesso host Linux puo stare in workstation_host_linux e in workstation_dev_fedora oppure workstation_dev_ubuntu, a seconda del layering che vuoi comporre.
Lo stato attuale del profilo workstation include:
- installazione pacchetti base Ubuntu via apt
- installazione pacchetti base Fedora via dnf per il ramo workstation nativo
- installazione e configurazione di Docker dal repository ufficiale
- gestione dei dotfiles workstation e rendering dei template dev condivisi
- installazione di Google Chrome su Ubuntu e Fedora,
VS Codesu Fedora via repository RPM Microsoft,IntelliJ IDEA Ultimatesu Fedora via COPR RPM, e applicazioni workstation residue su Fedora via Flatpak - installazione di applicazioni workstation su Ubuntu nativa via Snap, oltre alle estensioni GNOME sul solo host Linux nativo
- configurazione del ramo Windows 11 host con app installate dal playbook via
winget, con backend predefinitowinget_psrp, tema scuro, pin della taskbar gestiti via policy locale e profilo predefinito di Windows Terminal impostato suUbuntu - preparazione del ramo WSL Ubuntu con
systemdper il toolchain di sviluppo - attivazione del firewall UFW su Ubuntu nativa e
firewalldsu Fedora nativa - gestione di
gsettingsGNOME host-specifici sudeadalus-fedora, inclusi shell, Files/Nautilus, file chooser GTK e GNOME Text Editor, allineati allo stato reale della macchina
Workflow Windows + WSL previsto:
Prima di eseguire il bootstrap Windows, apri PowerShell come amministratore e verifica la policy di esecuzione:
Get-ExecutionPolicy -List
Se necessario, abilita l'esecuzione degli script per l'utente corrente:
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
Se Windows ha bloccato il file di bootstrap, sbloccalo esplicitamente:
Unblock-File .\scripts\bootstrap_windows_workstation.ps1
- eseguire
scripts/bootstrap_windows_workstation.ps1su Windows come amministratore - riavviare Windows se richiesto dalle feature WSL
- avviare Ubuntu WSL almeno una volta e completare la creazione dell'utente Linux
- installare Ansible dentro WSL Ubuntu
- lanciare il playbook da WSL su
deadalus-wslper configurare l'ambiente dev locale - lanciare da WSL anche il playbook su
deadalus-winviapsrpper configurare l'host Windows; per default il backend pacchetti Windows ewinget_psrp - usare VS Code con le estensioni Remote (
WSL,SSH,Dev Containers) dal lato Windows
Per il remoting Windows il repository usa di default PSRP con Negotiate su HTTPS/5986. L'utente di default puo essere un MicrosoftAccount\..., con host, utente e password forniti via vault o extra vars. Il backend pacchetti Windows e configurabile con windows_package_backend oppure vault_windows_package_backend; il default e winget_psrp.
Server
Sistema operativo:
- Ubuntu LTS
Configurazione:
- nessun ambiente grafico
Macchina:
prometheus
Profilo orientato a servizi server e gestione di dotfiles dedicati.
Lo stato attuale del profilo server include:
- installazione pacchetti base Ubuntu via apt
- installazione e configurazione di Docker dal repository ufficiale
- abilitazione dei servizi systemd dichiarati in inventory/group vars
- copia dei dotfiles server e rendering dei template server, incluso il
docker-compose.ymldello stack servizi - attivazione del firewall UFW con regola SSH esplicita
- apertura delle porte Syncthing
22000/tcp,22000/udpe21027/udp, lasciando la GUI non esposta direttamente su UFW
Utente del profilo server:
- il profilo usa
server_username,server_user_groupeserver_user_homedefiniti inansible/inventory/group_vars/server.yml - per default
server_usernameereditausername, ma puo essere sovrascritto per tutti gli host server via inventory oppure a runtime con extra vars - esempio override da CLI:
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser
- se necessario puoi passare anche:
ansible-playbook ansible/site.yml --limit prometheus -e server_username=myuser -e server_user_group=mygroup -e server_user_home=/srv/myuser
Composizione della configurazione
Deploy mirato della configurazione Emacs sui desktop Void:
ansible-playbook ansible/site.yml --limit ikaros --tags emacs
ansible-playbook ansible/site.yml --limit nymph --tags emacs
La configurazione finale di una macchina è ottenuta combinando più livelli.
common configuration
+ OS configuration
+ profile configuration
+ host overrides
Esempio per ikaros:
common + void + desktop + ikaros
Esempio per nymph:
common + void + desktop + nymph
Questo approccio consente di:
- mantenere configurazioni condivise
- applicare override specifici per host
- evitare duplicazioni
Ruoli Ansible
I principali ruoli attualmente presenti sono:
| Role | Descrizione |
|---|---|
| base | configurazione base comune |
| packages_void | installazione pacchetti su Void |
| packages_ubuntu | installazione pacchetti su Ubuntu |
| packages_fedora | installazione pacchetti su Fedora |
| services_runit | gestione servizi runit |
| services_systemd | gestione servizi systemd |
| profile_desktop_common | bootstrap desktop Void condiviso |
| profile_desktop_i3 | sessione desktop i3 |
| profile_desktop_sway | sessione desktop Sway |
| profile_desktop_host | override desktop specifici per host |
| profile_workstation_dev_common | configurazione dev workstation condivisa |
| profile_workstation_gnome | configurazione host workstation GNOME |
| profile_workstation_dev_wsl | configurazione WSL Ubuntu per sviluppo |
| profile_workstation_host_windows | configurazione host Windows 11 workstation |
| profile_server | configurazione server |
| dotfiles_common | distribuzione dotfiles comuni |
| dotfiles | distribuzione configurazioni utente |
Stato attuale del playbook principale
Il playbook ansible/site.yml e attualmente composto da sette blocchi:
all:!workstation_host_windows -> dotfiles_common
void -> packages_void + services_runit + profile_desktop_common + profile_desktop_i3 + profile_desktop_sway + profile_desktop_host
workstation_dev_ubuntu -> packages_ubuntu + services_systemd + profile_workstation_dev_common
workstation_dev_fedora -> packages_fedora + services_systemd + profile_workstation_dev_common
workstation_host_linux -> profile_workstation_gnome
workstation_dev_wsl -> packages_ubuntu + services_systemd + profile_workstation_dev_common + profile_workstation_dev_wsl
workstation_host_windows -> profile_workstation_host_windows
ubuntu_server -> packages_ubuntu + services_systemd + profile_server
Questo significa che, allo stato attuale:
- i desktop Void (
ikaros,nymph) restano il target operativo piu completo - la workstation Ubuntu (
deadalus-ubuntu) e gestita separando ambiente dev e layer host GNOME - la workstation Fedora (
deadalus-fedora) usa lo stesso principio di composizione a gruppi con il ramo Fedora dedicato e congsettingshost-specifici dichiarati in inventory - il ramo Windows + WSL e predisposto con bootstrap PowerShell e play Windows/WSL dedicati
- il server Ubuntu (
prometheus) e gestito con pacchetti, servizi, dotfiles server e firewall - lo stack container server include
navidrome,postgres,gitea,nginx-proxy-manageresyncthing, con GUI Syncthing raggiungibile tramite la rete Dockerweb
Dotfiles
La directory dotfiles/ contiene le configurazioni utente versionate.
dotfiles/
├── common
├── desktop
├── server
├── fedora
├── workstation
├── ikaros
└── nymph
Le configurazioni sono applicate tramite Ansible e organizzate per livelli:
| Livello | Scopo |
|---|---|
| common | configurazioni condivise |
| profile | configurazioni per tipo macchina |
| host | override specifici |
Requisiti
Per utilizzare il repository sono necessari:
- Python 3
- Ansible
ansible-lintyamllintshellcheck- collection definite in
ansible/collections/requirements.yml - accesso locale o SSH alle macchine target, in base a come e definito l'inventory
Installazione base:
python3 -m pip install ansible ansible-lint yamllint shellcheck-py
ansible-galaxy collection install -r ansible/collections/requirements.yml
Gestione segreti:
- il repository supporta il caricamento opzionale di
secrets/vault.yml - il repository supporta anche
secrets/vault.local.ymlper override locali non versionati secrets/vault.yml.examplefunge da template/esempio- se
secrets/vault.ymlnon e presente, il playbook continua comunque senza caricare variabili locali opzionali - se
secrets/.vault_pass.gpgesiste viene usato automaticamente per sbloccare i vault tramitegpg; in alternativa resta supportatosecrets/.vault_passcome fallback legacy locale; se nessuno dei due file esiste Ansible richiede la password in modo interattivo - per il ramo Windows puoi anche definire
vault_windows_package_backend, con valori supportatiwinget_psrpewinget_wsl_local; il default ewinget_psrp
Utilizzo
Eseguire il playbook principale:
ansible-playbook ansible/site.yml
Allo stato attuale questo comando:
- distribuisce i dotfiles comuni a tutti gli host
- per gli host Void applica bootstrap desktop condiviso, sessioni i3/Sway e override specifici per host
- per
workstation_dev_ubuntuapplica pacchetti Ubuntu, servizi systemd e profilo dev comune - per
workstation_dev_fedoraapplica pacchetti Fedora, servizi systemd e profilo dev comune - per
workstation_host_linuxapplica il layer host Linux GNOME - per
workstation_dev_wslapplica pacchetti Ubuntu, servizi systemd, profilo dev comune e tweak WSL dedicati - per
workstation_host_windowsapplica il layer host Windows 11 via PSRP, con installazione pacchetti Windows eseguita di default tramitewinget_psrp - per gli host
ubuntu_serverapplica pacchetti Ubuntu, servizi systemd, profilo server, UFW, dotfiles e template dedicati - non riavvia automaticamente
emptty; le modifiche al display manager vanno applicate manualmente da SSH o da una TTY separata - carica
secrets/vault.ymlsolo se presente - carica
secrets/vault.local.ymlsolo se presente, dopovault.yml, cosi gli override locali hanno precedenza
Per validare prima di applicare:
ansible-playbook ansible/site.yml --syntax-check
ansible-playbook ansible/site.yml --limit ikaros --check --diff
ansible-playbook ansible/site.yml --limit nymph --check --diff
ansible-playbook ansible/site.yml --limit deadalus-ubuntu --check --diff
ansible-playbook ansible/site.yml --limit deadalus-fedora --check --diff
ansible-playbook ansible/site.yml --limit deadalus-wsl --check --diff
ansible-playbook ansible/site.yml --limit prometheus --check --diff
ansible-lint ansible/site.yml
ansible-lint ansible/roles
yamllint ansible/
Per testare un override dell'utente server senza modificare l'inventory:
ansible-playbook ansible/site.yml --limit prometheus --check --diff -e server_username=myuser
Per validazioni piu mirate:
ansible-playbook ansible/site.yml --limit <host> --tags <tag1>,<tag2> --check --diff
ansible-playbook ansible/site.yml --limit <host> --start-at-task "<task name>" --check --diff
ansible-lint ansible/roles/<role>
yamllint ansible/path/to/file.yml
docker compose -f /opt/docker/server/docker-compose.yml config
Tag supportati dal playbook
Per vedere l'elenco reale aggiornato dei tag disponibili:
ansible-playbook ansible/site.yml --list-tags
Allo stato attuale ansible/site.yml espone questi tag:
| Tag | Scopo | Ambito principale |
|---|---|---|
always |
pre-task sempre eseguiti, inclusi caricamento vault e validazioni preliminari | common, Windows |
dotfiles |
distribuzione/configurazione dotfiles | tutti i profili |
dotfiles:common |
dotfiles comuni condivisi | common, workstation, server |
dotfiles:desktop |
dotfiles desktop | desktop Void |
dotfiles:host |
override host-specifici desktop | desktop Void |
dotfiles:server |
dotfiles dedicati al profilo server | server |
dotfiles:workstation |
dotfiles dedicati alle workstation | workstation Linux, WSL |
emptty |
gestione display manager emptty |
desktop Void |
gnome |
configurazione host GNOME | workstation host Linux, parte desktop |
i3 |
sessione/configurazione i3 | desktop Void |
npm |
installazione pacchetti npm globali | desktop Void, workstation Linux, WSL |
nvidia |
componenti NVIDIA desktop | desktop Void |
packages |
installazione e aggiornamento pacchetti | tutti i profili |
services |
gestione servizi runit/systemd/Windows | tutti i profili |
sway |
sessione/configurazione Sway | desktop Void |
vscode |
installazione/configurazione VS Code | Fedora, host Linux, Windows |
wsl |
bootstrap e configurazione WSL | WSL, Windows |
Esempi pratici:
ansible-playbook ansible/site.yml --limit nymph --tags dotfiles:desktop,sway --check --diff
ansible-playbook ansible/site.yml --limit deadalus-fedora --tags packages,vscode --check --diff
ansible-playbook ansible/site.yml --limit prometheus --tags services,dotfiles:server --check --diff
Bootstrap di una nuova macchina
Una nuova macchina può essere inizializzata con i seguenti passaggi:
git clone <repo>
cd <repo-dir>
ansible-galaxy collection install -r ansible/collections/requirements.yml
ansible-playbook ansible/site.yml
Dopo l'esecuzione del playbook la macchina verra configurata secondo il profilo definito e i ruoli attualmente orchestrati.
Per il flusso mail desktop esiste inoltre uno script dedicato:
scripts/bootstrap_mail.sh
Lo script si occupa del bootstrap dei secret nel keyring, del primo sync con mbsync e dell'inizializzazione di mu usando la configurazione mail generata dai template.
Se modifichi questo script, valida almeno con:
sh -n scripts/bootstrap_mail.sh
shellcheck scripts/bootstrap_mail.sh
Filosofia del progetto
Il repository segue alcuni principi chiave:
- Infrastructure as Code
- configurazione dichiarativa
- idempotenza
- ambienti riproducibili
- separazione tra configurazione sistema e configurazione utente
Questo consente di ricreare qualsiasi macchina partendo esclusivamente dal repository.
Roadmap
Possibili evoluzioni future:
- hardening sicurezza server
- configurazione backup
- testing automatico playbook
- integrazione CI
- supporto ad altre distribuzioni Linux
Licenza
Questo progetto è distribuito sotto licenza LGPL-3.0.