No description
| group_vars | ||
| roles | ||
| ansible.cfg | ||
| inventory.yml | ||
| playbook.yml | ||
| README.md | ||
Ansible Fedora Setup
Modular Ansible role system for setting up a fresh Fedora development workstation.
Quick Start
# Review the playbook and roles first!
ansible-playbook -i inventory.yml playbook.yml --check --diff
# Apply (prompt for become password):
ansible-playbook -i inventory.yml playbook.yml --ask-become-pass
Structure
ansible-setup-fedora/
├── ansible.cfg # Ansible configuration
├── inventory.yml # Localhost inventory
├── playbook.yml # Main playbook importing all roles
├── README.md # This file
└── roles/
├── common/ # Shared handlers, vars, pre-tasks
├── essentials/ # Core CLI tools (git, curl, tmux, etc.)
├── docker/ # Docker CE + docker-compose
├── vis-editor/ # Vis text editor
├── stow/ # GNU Stow
├── dotfiles/ # Personal dotfiles (codeberg.org/0x9e/dotfiles)
├── nodejs/ # Node.js via nvm
├── go/ # Go programming language
├── netbird/ # NetBird VPN client
├── yubikey-ssh/ # YubiKey SSH + GPG setup
├── php-composer/ # PHP + Composer
└── pi-assistant/ # @mariozechner/pi-coding-assistant
Customization
Omitting roles
Edit playbook.yml and comment out (or remove) the roles you don't need.
Each role has a when: false example commented inline.
Example — skip Node.js and Go:
roles:
- role: essentials
# - role: nodejs
# when: false
# - role: go
# when: false
- role: vis-editor
# ... remaining roles
Role variables
Each role with configurable options has a defaults/main.yml. Override in
the playbook or via --extra-vars:
ansible-playbook -i inventory.yml playbook.yml \
--extra-vars "docker_users=['myuser']"
Per-role guide
| Role | What it installs | Configurable vars | Notes |
|---|---|---|---|
| common | Core dirs, locale, dnf cache update | None | Run first — provides handlers |
| essentials | git, curl, htop, tmux, unzip, wget, make, gcc, btop, ripgrep, fd-find, fastfetch | None | No vim (vis is the editor) |
| docker | docker-ce, docker-ce-cli, containerd.io, docker-compose-plugin | docker_users |
Adds users to docker group |
| vis-editor | Vis text editor | None | Installs via dnf (COPR if needed) |
| stow | GNU Stow | None | Required by dotfiles role |
| dotfiles | Clones codeberg.org/0x9e/dotfiles + stows |
dotfiles_repo, dotfiles_dest |
Idempotent (pull on existing clone) |
| nodejs | Node.js (LTS via nvm) + npm | None | Nvm installed to ~/.nvm |
| go | Go from official tarball | None | Installed to /usr/local/go |
| netbird | NetBird VPN client | None | Systemd service enabled |
| yubikey-ssh | openssh-clients, gnupg2, pcscd, yubikey-manager | SSH key comment, agent forwarding | SSH via GPG agent |
| php-composer | PHP + CLI + common extensions + Composer | None | Composer installed globally |
| pi-assistant | @mariozechner/pi-coding-assistant |
None | Requires Node.js |
Requirements
- Fedora 41+ (target OS)
ansible-coreinstalled on the control node- Sudo/nopasswd or become password
- Internet access for package downloads
Idempotence
All roles are designed to be idempotent — running the playbook multiple
times produces the same result. Each task has a meaningful name: and uses
Ansible's declarative modules (dnf, copy, template, etc.).