Replicate a fully configured Fedora KDE workstation onto a fresh Fedora install — every visual, functional, and behavioral aspect of the source machine reproduced on the target.
| Component | Purpose |
|---|---|
audit.sh |
Captures complete system state on the source machine (read-only) |
populate.sh |
Transforms the audit snapshot into Ansible variables and role files |
site.yml |
Ansible playbook that applies the captured state to a fresh install |
The audit script uses standard Fedora tools (rsync, rpm, dnf, flatpak, systemctl, etc.). It runs as your normal user — not root. Some captures (NetworkManager profiles, SDDM config) may be incomplete without root-readable files; the playbook handles those separately.
./audit.sh # creates snapshot/Starting from a fresh Fedora KDE install (first boot or live session), both machines on the same LAN:
sudo dnf install ansible git rsync python3-libselinuxInstall the required Ansible collections:
ansible-galaxy collection install community.general ansible.posixgit clone https://github.com/YOUR_USERNAME/fedora-migrate.git
cd fedora-migrateOn the source machine:
cd fedora-migrate
./audit.shThis creates snapshot/ in the current directory.
Ensure SSH is running on the source machine:
sudo dnf install openssh-server
sudo systemctl enable --now sshdGet the source machine's IP:
hostname -I # first address is typically your LAN IPOn the target machine, pull the snapshot from the source via rsync:
# Replace SOURCE_IP and SOURCE_USER for your setup
rsync -avz --progress SOURCE_USER@SOURCE_IP:~/git/fedora-migrate/snapshot/ ./snapshot/
# Also transfer SSH keys now (avoids a manual step later)
rsync -av SOURCE_USER@SOURCE_IP:~/.ssh/id_* ~/.ssh/
chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_* && chmod 644 ~/.ssh/id_*.pub./populate.shThis reads snapshot/ and generates:
group_vars/all.yml— all variables for the playbook- Files in
roles/*/files/— config files, themes, wallpapers, etc.
# Review the generated variables
$EDITOR group_vars/all.yml
# Dry run — see what would change without applying
ansible-playbook site.yml --check --diff --ask-become-passansible-playbook site.yml --ask-become-passRun specific roles if you prefer incremental migration:
ansible-playbook site.yml --tags repos,packages --ask-become-pass
ansible-playbook site.yml --tags shell
ansible-playbook site.yml --tags desktop
# etc.# Reboot first, then:
./verify.shSee MANUAL_STEPS.md for the few items that require human intervention (browser logins, Bluetooth pairing, etc.).