|
| 1 | +<!-- |
| 2 | +SPDX-License-Identifier: CC-BY-SA-4.0 |
| 3 | +SPDX-FileCopyrightText: 2025-2026 Jonathan D.A. Jewell <j.d.a.jewell@open.ac.uk> |
| 4 | +--> |
| 5 | + |
| 6 | +# What This Is |
| 7 | + |
| 8 | +Complete infrastructure-as-code for local system management, replacing |
| 9 | +SaltStack with modern Ansible + Terraform. |
| 10 | + |
| 11 | +- **Ansible** manages configuration: packages, users, files, services, |
| 12 | + firewall, monitoring, networking — everything that runs *on* your |
| 13 | + host. |
| 14 | + |
| 15 | +- **Terraform** manages container provisioning: declarative lifecycle |
| 16 | + management of Podman containers with state tracking. |
| 17 | + |
| 18 | +Designed for Fedora Silverblue (immutable OS) but works on any Fedora. |
| 19 | + |
| 20 | +# Quick Start |
| 21 | + |
| 22 | +```bash |
| 23 | +./scripts/bootstrap.sh # Install dependencies |
| 24 | +vim ansible/inventory/group_vars/all.yml # Customise |
| 25 | +just check # Dry run |
| 26 | +just apply # Apply |
| 27 | +``` |
| 28 | + |
| 29 | +# Design Principles |
| 30 | + |
| 31 | +Homoiconic |
| 32 | +Configuration describes itself. `group_vars/all.yml` IS the system |
| 33 | +specification. |
| 34 | + |
| 35 | +Reflexive |
| 36 | +The system inspects its own state. Run `just` `self-check` or `just` |
| 37 | +`report`. |
| 38 | + |
| 39 | +Dependable |
| 40 | +All operations are idempotent. Run `just` `check` for safe dry runs. |
| 41 | + |
| 42 | +Secure |
| 43 | +Firewall-first, least-privilege, Ansible Vault for secrets, rootless |
| 44 | +Podman. |
| 45 | + |
| 46 | +Interoperable |
| 47 | +Compatible with [HAR](../ambientops/hybrid-automation-router/) for IaC |
| 48 | +translation. |
| 49 | + |
| 50 | +# Repository Structure |
| 51 | + |
| 52 | +```text |
| 53 | +ansible/ |
| 54 | + inventory/group_vars/all.yml ← EDIT THIS: your desired system state |
| 55 | + playbooks/site.yml ← Master playbook |
| 56 | + roles/ ← 11 modular roles |
| 57 | +terraform/ |
| 58 | + main.tf ← Container provisioning |
| 59 | + terraform.tfvars.example ← Container definitions template |
| 60 | +scripts/ |
| 61 | + bootstrap.sh ← First-time setup |
| 62 | + self-check.sh ← State validation |
| 63 | +docs/ ← Architecture, migration, quickstart |
| 64 | +justfile ← Task runner recipes |
| 65 | +``` |
| 66 | + |
| 67 | +# Ansible Roles |
| 68 | + |
| 69 | +| Role | Purpose | Salt Equivalent | |
| 70 | +|----|----|----| |
| 71 | +| `base_packages` | Essential system packages | `packages.sls` | |
| 72 | +| `users` | User accounts and SSH keys | `users.sls` | |
| 73 | +| `files_managed` | Configuration files (MOTD, profile) | `files.sls` | |
| 74 | +| `services` | Systemd service management | `services.sls` | |
| 75 | +| `firewall` | Firewalld rules | `firewall.sls` | |
| 76 | +| `sudo_config` | Sudo rules via drop-in files | `sudo.sls` | |
| 77 | +| `monitoring` | Monitoring tools and self-monitoring | `monitoring/init.sls` | |
| 78 | +| `networking` | /etc/hosts, hostname, DNS | `networking/init.sls` | |
| 79 | +| `podman_containers` | Podman container management | `containers/init.sls` | |
| 80 | +| `silverblue` | Immutable OS adaptations | *(new)* | |
| 81 | +| `development` | Developer tools (asdf, runtimes) | *(new)* | |
| 82 | + |
| 83 | +# Common Commands |
| 84 | + |
| 85 | +```bash |
| 86 | +just apply # Apply all configuration |
| 87 | +just check # Dry run (show changes without applying) |
| 88 | +just apply-tags security # Apply only firewall + sudo |
| 89 | +just self-check # Validate current system state |
| 90 | +just report # View last change report |
| 91 | +just tf-plan # Preview container changes |
| 92 | +just tf-apply # Provision containers |
| 93 | +just bootstrap # First-time setup |
| 94 | +just migrate # Salt migration helper |
| 95 | +``` |
| 96 | + |
| 97 | +# License |
| 98 | + |
| 99 | +MPL-2.0 |
| 100 | + |
| 101 | +Copyright (c) 2026 Jonathan D.A. Jewell (hyperpolymath) |
| 102 | +\<[j.d.a.jewell@open.ac](j.d.a.jewell@open.ac).uk\> |
0 commit comments