diff --git a/roles/trixie_migration/tasks/backup-dirs.yml b/roles/trixie_migration/tasks/backup-dirs.yml new file mode 100644 index 0000000..2a0cf57 --- /dev/null +++ b/roles/trixie_migration/tasks/backup-dirs.yml @@ -0,0 +1,19 @@ +- name: Sichere Verzeichnisse + become: true + ansible.builtin.command: + cmd: > + tar + --create + --gzip + --file {{ backup_host_dir }}/{{ item }}.tar.gz + --preserve-permissions + --same-owner + --numeric-owner + -C / + {{ item }} + args: + creates: "{{ backup_host_dir }}/{{ item }}.tar.gz" + tags: backup + loop: "{{ backupdirs }}" + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] + diff --git a/roles/trixie_migration/tasks/backup-etc.yml b/roles/trixie_migration/tasks/backup-etc.yml new file mode 100644 index 0000000..b6f259e --- /dev/null +++ b/roles/trixie_migration/tasks/backup-etc.yml @@ -0,0 +1,8 @@ +- name: Sichere /etc + ansible.builtin.copy: + src: /etc/ + dest: "{{ backup_host_dir }}/etc/" + remote_src: yes + mode: preserve + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] + diff --git a/roles/trixie_migration/tasks/backup-home.yml b/roles/trixie_migration/tasks/backup-home.yml new file mode 100644 index 0000000..684b35c --- /dev/null +++ b/roles/trixie_migration/tasks/backup-home.yml @@ -0,0 +1,7 @@ +- name: Sichere /home/ + ansible.builtin.copy: + src: /home/ + dest: "{{ backup_host_dir }}/home/" + remote_src: yes + mode: preserve + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] diff --git a/roles/trixie_migration/tasks/backup-opt.yml b/roles/trixie_migration/tasks/backup-opt.yml new file mode 100644 index 0000000..9f1d71b --- /dev/null +++ b/roles/trixie_migration/tasks/backup-opt.yml @@ -0,0 +1,9 @@ +- name: Sichere /opt + ansible.builtin.copy: + src: /opt + dest: "{{ backup_host_dir }}/opt/" + remote_src: yes + mode: preserve + become: true + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] + diff --git a/roles/trixie_migration/tasks/config-dns.yml b/roles/trixie_migration/tasks/config-dns.yml new file mode 100644 index 0000000..e5896a7 --- /dev/null +++ b/roles/trixie_migration/tasks/config-dns.yml @@ -0,0 +1,16 @@ +- name: Setze DNS-Server auf Pi-hole für NetworkManager-Connection "preconfigured" + become: true + ansible.builtin.command: + cmd: > + nmcli connection modify "preconfigured" + ipv4.dns "{{ dns_ip }}" + ipv4.ignore-auto-dns yes + tags: dns + when: ansible_facts.lsb.codename == "trixie" + +- name: Aktiviere geänderte DNS-Einstellungen + become: true + ansible.builtin.command: nmcli connection up "preconfigured" + tags: dns + when: ansible_facts.lsb.codename == "trixie" + diff --git a/roles/trixie_migration/tasks/create-backup-dirs.yml b/roles/trixie_migration/tasks/create-backup-dirs.yml new file mode 100644 index 0000000..987d19c --- /dev/null +++ b/roles/trixie_migration/tasks/create-backup-dirs.yml @@ -0,0 +1,6 @@ +- name: Erstelle Host-spezifische Backup-Verzeichnisse + file: + path: "{{ backup_host_dir }}/{{ item }}" + state: directory + loop: "{{backupdirs}}" + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] diff --git a/roles/trixie_migration/tasks/debug.yml b/roles/trixie_migration/tasks/debug.yml new file mode 100644 index 0000000..72c93a4 --- /dev/null +++ b/roles/trixie_migration/tasks/debug.yml @@ -0,0 +1,4 @@ +- name: Zeige Systeminformationen + debug: + msg: "Host: {{ inventory_hostname }} | Codename: {{ ansible_facts.lsb.codename }}" + diff --git a/roles/trixie_migration/tasks/export.yml b/roles/trixie_migration/tasks/export.yml new file mode 100644 index 0000000..26704bd --- /dev/null +++ b/roles/trixie_migration/tasks/export.yml @@ -0,0 +1,33 @@ +- name: Exportiere installierte Pakete als YAML + shell: | + echo "packages:" > "{{ packages_file }}" + dpkg-query -W -f=' - ${Package}\n' | sort >> "{{ packages_file }}" + args: + executable: /usr/bin/bash + tags: export + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] + +- name: Prüfe, ob packages.yml erstellt wurde + ansible.builtin.stat: + path: "{{ packages_file }}" + register: packages_file_check + tags: export + when: ansible_facts.lsb.codename in ["bookworm", "bullseye"] + +- name: Abbrechen, wenn packages.yml fehlt + ansible.builtin.fail: + msg: "FEHLER: packages.yml wurde nicht erstellt – Paketexport ist fehlgeschlagen." + tags: export + when: + - ansible_facts.lsb.codename in ["bookworm", "bullseye"] + - not packages_file_check.stat.exists + +- name: Abbrechen, wenn packages.yml leer ist + ansible.builtin.fail: + msg: "FEHLER: packages.yml wurde erstellt, ist aber leer." + tags: export + when: + - ansible_facts.lsb.codename in ["bookworm", "bullseye"] + - packages_file_check.stat.size | int == 0 + + diff --git a/roles/trixie_migration/tasks/install.yml b/roles/trixie_migration/tasks/install.yml new file mode 100644 index 0000000..da79bb8 --- /dev/null +++ b/roles/trixie_migration/tasks/install.yml @@ -0,0 +1,49 @@ +- name: Kopiere packages.yml auf Trixie + ansible.builtin.copy: + src: "{{ packages_file }}" + dest: "/tmp/packages.yml" + remote_src: no # Quelle liegt auf Control-Host + tags: install + +- name: Prüfe, ob packages.yml auf Trixie existiert + become: true + stat: + path: /tmp/packages.yml + tags: install + register: pkgfile + +- name: Lade Paketliste auf Trixie ein + become: true + slurp: + src: /tmp/packages.yml + register: packages_yml + tags: install + when: pkgfile.stat.exists + +- name: Konvertiere Paketliste in Variablen + set_fact: + packages_data: "{{ packages_yml.content | b64decode | from_yaml }}" + tags: install + when: pkgfile.stat.exists + +- name: Lese Paketliste ein und ersetze exa durch eza + set_fact: + packages_data_fixed: "{{ packages_data.packages | map('regex_replace', '^exa$', 'eza') | list }}" + tags: install + when: ansible_facts.lsb.codename == "trixie" + +- name: Lese Paketliste ein und ersetze neofetch durch fastfetch + set_fact: + packages_data_fixed: "{{ packages_data_fixed| map('regex_replace', '^neofetch$', 'fastfetch') | list }}" + tags: install + when: ansible_facts.lsb.codename == "trixie" + +- name: Installiere gesicherte Pakete + apt: + name: "{{ item }}" + state: present + become: true + loop: "{{ packages_data_fixed }}" + ignore_errors: yes + tags: install + when: ansible_facts.lsb.codename == "trixie" diff --git a/roles/trixie_migration/tasks/main.yml b/roles/trixie_migration/tasks/main.yml new file mode 100644 index 0000000..2b6bafc --- /dev/null +++ b/roles/trixie_migration/tasks/main.yml @@ -0,0 +1,15 @@ +- include_vars: "roles/trixie_migration/vars/backup-dirs.yml" + +# Phase 1: bookworm sichern +- import_tasks: debug.yml +- import_tasks: create-backup-dirs.yml +- import_tasks: export.yml +- import_tasks: backup-dirs.yml + +#Phase 2: Trixie aufsetzen +- import_tasks: config-dns.yml +- import_tasks: upgrade.yml +- import_tasks: mounttank.yml +- import_tasks: install.yml +- import_tasks: restore-dirs.yml +- import_tasks: reboot.yml diff --git a/roles/trixie_migration/tasks/mounttank.yml b/roles/trixie_migration/tasks/mounttank.yml new file mode 100644 index 0000000..fbdadf8 --- /dev/null +++ b/roles/trixie_migration/tasks/mounttank.yml @@ -0,0 +1,36 @@ +- name: create tank dir + become: true + file: + path: "/tank" + state: directory + tags: mount + when: ansible_facts.lsb.codename == "trixie" + +- name: Installiere nfs-common + apt: + name: + - nfs-common + - eza + state: present + become: true + tags: mount + when: ansible_facts.lsb.codename == "trixie" + + +- name: Ensure /tank is mounted + become: true + ansible.posix.mount: + path: /tank + src: "{{nas_ip}}:/mnt/md0/public" + fstype: "nfs" + opts: "defaults" + state: mounted + tags: mount + when: ansible_facts.lsb.codename == "trixie" + +- name: Facts aktualisieren + setup: + filter: ansible_mounts + tags: mount + when: ansible_facts.lsb.codename == "trixie" + diff --git a/roles/trixie_migration/tasks/reboot.yml b/roles/trixie_migration/tasks/reboot.yml new file mode 100644 index 0000000..97b7adb --- /dev/null +++ b/roles/trixie_migration/tasks/reboot.yml @@ -0,0 +1,7 @@ +--- +- name: Neustart des neuen Systems. + ansible.builtin.reboot: + reboot_timeout: 300 + msg: " Neustart des Trixie Systems wird durchgeführt." + when: ansible_facts.lsb.codename == "trixie" + diff --git a/roles/trixie_migration/tasks/restore-dirs.yml b/roles/trixie_migration/tasks/restore-dirs.yml new file mode 100644 index 0000000..58a7eb3 --- /dev/null +++ b/roles/trixie_migration/tasks/restore-dirs.yml @@ -0,0 +1,26 @@ +- name: Verzeichnisse wiederherstellen + become: true + ansible.builtin.command: + cmd: > + tar + --extract + --gzip + --file {{ backup_host_dir }}/{{ item }}.tar.gz + --preserve-permissions + --same-owner + --numeric-owner + -C / + loop: + - /home + - /opt + when: ansible_facts.lsb.codename == "trixie" + +- name: Eigentümer für /home/pi korrigieren + file: + path: /home/pi + owner: pi + group: pi + recurse: yes + tags: restore + when: ansible_facts.lsb.codename == "trixie" + diff --git a/roles/trixie_migration/tasks/restore-etc.yml b/roles/trixie_migration/tasks/restore-etc.yml new file mode 100644 index 0000000..0eb56ac --- /dev/null +++ b/roles/trixie_migration/tasks/restore-etc.yml @@ -0,0 +1,9 @@ +- name: /etc wiederherstellen (vorsichtig!) + synchronize: + src: "{{ restore_etc_src }}/" + dest: /etc/ + recursive: yes + delete: no + rsync_opts: + - "--info=progress2" + diff --git a/roles/trixie_migration/tasks/restore-home.yml b/roles/trixie_migration/tasks/restore-home.yml new file mode 100644 index 0000000..39072c0 --- /dev/null +++ b/roles/trixie_migration/tasks/restore-home.yml @@ -0,0 +1,17 @@ +- name: /home/pi wiederherstellen + ansible.builtin.copy: + src: "{{ backup_host_dir }}/home/" + dest: /home/ + remote_src: yes + mode: preserve + when: ansible_facts.lsb.codename == "trixie" + +- name: Eigentümer für /home/pi korrigieren + file: + path: /home/pi + owner: pi + group: pi + recurse: yes + when: ansible_facts.lsb.codename == "trixie" + + diff --git a/roles/trixie_migration/tasks/restore-opt.yml b/roles/trixie_migration/tasks/restore-opt.yml new file mode 100644 index 0000000..343dbf9 --- /dev/null +++ b/roles/trixie_migration/tasks/restore-opt.yml @@ -0,0 +1,8 @@ +- name: /opt wiederherstellen + ansible.builtin.copy: + src: "{{ backup_host_dir }}/opt/" + dest: /opt/ + remote_src: yes + mode: preserve + become: true + when: ansible_facts.lsb.codename == "trixie" diff --git a/roles/trixie_migration/tasks/upgrade.yml b/roles/trixie_migration/tasks/upgrade.yml new file mode 100644 index 0000000..e662368 --- /dev/null +++ b/roles/trixie_migration/tasks/upgrade.yml @@ -0,0 +1,7 @@ +- name: Update & dist-upgrade + apt: + update_cache: yes + upgrade: dist + become: true + tags: upgrade + when: ansible_facts.lsb.codename == "trixie" diff --git a/roles/trixie_migration/vars/backup-dirs.yml b/roles/trixie_migration/vars/backup-dirs.yml new file mode 100644 index 0000000..1d7df72 --- /dev/null +++ b/roles/trixie_migration/vars/backup-dirs.yml @@ -0,0 +1,5 @@ +backupdirs: + - /home + - /etc + - /opt + diff --git a/roles/trixie_migration/vars/main.yml b/roles/trixie_migration/vars/main.yml new file mode 100644 index 0000000..ce51648 --- /dev/null +++ b/roles/trixie_migration/vars/main.yml @@ -0,0 +1,15 @@ +# IP +dns_ip: "192.168.178.60" +nas_ip: "192.168.178.36" + +#Netzwerkverbindung +nm_connection_name: "netplan-wlan0-" +# Pfade + +backup_base: /tank/trixie +backup_host_dir: "{{ backup_base }}/{{ inventory_hostname }}" +restore_home_src: "{{ backup_host_dir }}/home/pi" +restore_etc_src: "{{ backup_host_dir }}/etc" +packages_file: "{{ backup_host_dir }}/packages.yml" + + diff --git a/trixi-migration.yml b/trixi-migration.yml new file mode 100644 index 0000000..8a16a3e --- /dev/null +++ b/trixi-migration.yml @@ -0,0 +1,9 @@ +--- +- name: Raspberry Pi Backup oder Restore je nach OS-Codename + hosts: "{{ target }}" + become: yes + gather_facts: yes + remote_user: pi + roles: + - trixie_migration +