Goals:
- Friction-less recovery after fresh OS install for local devices
- Easy cloud resource provisioning with Terraform
- Minimal secret management via 1Password
# 1. Create infrastructure (Tailscale auto-installs via cloud-init)
cd terraform
./tf apply
# 2. Wait for droplet to appear on Tailscale
# 3. Bootstrap server (via Tailscale SSH)
cd ../ansible
ansible-playbook -i inventory.yml bootstrap.yml --limit <hostname> -u rootcd ansible
op-personal # Sign into 1Password
ansible-playbook -i inventory.yml common.yml --limit <hostname> --ask-become-pass┌─────────────────────────────────────────────────────────┐
│ 1Password │
│ (SSH keys, passwords, Tailscale authkey, API tokens) │
└─────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌─────────────────────┐ ┌─────────────────────┐
│ Terraform │ │ Ansible │
│ (cloud resources) │ │ (configuration) │
├─────────────────────┤ ├─────────────────────┤
│ • Droplets │ │ • bootstrap │
│ • DNS records │ │ • common_cli │
│ • Firewalls │ │ • dev / dev_gui │
│ • VPCs │ │ • media_server │
│ • Cloud-init │ │ • projects │
│ (Tailscale) │ │ • jasonernst_com │
└─────────────────────┘ └─────────────────────┘
- I hate snaps. Wherever possible I use apt on ubuntu.
- SSH access via Tailscale SSH (no public SSH keys on servers)
- All secrets from 1Password (no hardcoded values)
Provisions DigitalOcean cloud resources:
- Droplets with cloud-init (Tailscale auto-setup)
- DNS records
- Firewalls
- VPCs
- Remote state in DO Spaces
Configures all machines in the fleet:
bootstraprole: minimal server setup (user + Docker + SSH keys)common_clirole: full workstation setup (Tailscale + dev tools + dotfiles)
Used to run a clean base OS image in a VM (prefer this to docker since its more of a "complete" system). Currently setup to start the VM, and uses a provisioner to deploy ansible roles. The idea with these is to make sure that fresh installs can still provision because over time a system accumulates little changes and can diverge signficantly from a fresh install. Read more
Not really used right now. If I wanted to make a custom VM image to start from I could do it here, but I've found the vagrant bento images sufficient instead. Read more