From 0f452c44ecbcf7744825729f84b850595fd0daf1 Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Wed, 9 Sep 2026 14:44:38 +0200 Subject: [PATCH] =?UTF-8?q?Phase=202:=206=20Sonderfall-App-Rollen=20(kein?= =?UTF-8?q?=20regul=C3=A4res=20Debian-Paket)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit google-chrome, anydesk: distributionsunabhängige Hersteller-apt-Repos (Repo-URL+GPG-Key real recherchiert und verifiziert, 09.09.2026). kolibri: neueres, distributionsunabhängiges GitHub-Pages-Repo von Learning Equality (offiziell nur für Debian 13+ dokumentiert - NICHT live auf Mint/Ubuntu bestätigt, siehe Rollenkommentar). veyon: kein universelles Repo verfügbar, offizielle .deb-Downloads sind pro Distro/Version fest gebaut - Codename-Erkennung über /etc/os-release (UBUNTU_CODENAME bei Mint/Ubuntu, VERSION_CODENAME bei Debian) mit expliziter Zuordnungstabelle (trixie/noble/resolute). Nur der Debian-Fall bisher real bestätigt, siehe Rollenkommentar - vor breitem Rollout auf allen drei Golden-VMs live gegenprüfen. gdevelop, turbowarp: kein Debian-Paket, Flathub-IDs real bestätigt (io.gdevelop.ide, org.turbowarp.TurboWarp) - Flatpak-Fallback wie bei brave/libreoffice/onlyoffice. Vectr bewusst NICHT als native Rolle - hat kein Debian-Paket, nur Snap (passt nicht zu Mints Snap-Abstinenz) oder Web-App - wird stattdessen ein Default-Eintrag im neuen Webapp-Mechanismus. Gehört zusammen mit admin/provisioning-server-Migration 0031 (live auf anode angewendet+verifiziert: 6 Merkmale, 18 Blueprint-Zeilen). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9 --- roles/anydesk/defaults/main.yml | 1 + roles/anydesk/tasks/main.yml | 65 ++++++++++++++++++++++++ roles/gdevelop/defaults/main.yml | 1 + roles/gdevelop/tasks/main.yml | 45 +++++++++++++++++ roles/google-chrome/defaults/main.yml | 1 + roles/google-chrome/tasks/main.yml | 59 ++++++++++++++++++++++ roles/kolibri/defaults/main.yml | 1 + roles/kolibri/tasks/main.yml | 67 +++++++++++++++++++++++++ roles/turbowarp/defaults/main.yml | 1 + roles/turbowarp/tasks/main.yml | 45 +++++++++++++++++ roles/veyon/defaults/main.yml | 1 + roles/veyon/tasks/main.yml | 71 +++++++++++++++++++++++++++ site.yml | 54 ++++++++++++++++++++ 13 files changed, 412 insertions(+) create mode 100644 roles/anydesk/defaults/main.yml create mode 100644 roles/anydesk/tasks/main.yml create mode 100644 roles/gdevelop/defaults/main.yml create mode 100644 roles/gdevelop/tasks/main.yml create mode 100644 roles/google-chrome/defaults/main.yml create mode 100644 roles/google-chrome/tasks/main.yml create mode 100644 roles/kolibri/defaults/main.yml create mode 100644 roles/kolibri/tasks/main.yml create mode 100644 roles/turbowarp/defaults/main.yml create mode 100644 roles/turbowarp/tasks/main.yml create mode 100644 roles/veyon/defaults/main.yml create mode 100644 roles/veyon/tasks/main.yml diff --git a/roles/anydesk/defaults/main.yml b/roles/anydesk/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/anydesk/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/anydesk/tasks/main.yml b/roles/anydesk/tasks/main.yml new file mode 100644 index 0000000..376d9aa --- /dev/null +++ b/roles/anydesk/tasks/main.yml @@ -0,0 +1,65 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# AnyDesk gibt es nicht im Debian/Ubuntu-Repo (proprietär) - AnyDesks +# eigenes apt-Repo ist distributionsunabhängig gepflegt (Debian+Ubuntu, +# verifiziert 09.09.2026), ein einziger Rollencode für alle drei Backends. + +- name: Verzeichnis /etc/apt/keyrings anlegen (falls noch nicht vorhanden) + ansible.builtin.file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + when: tuxflotte_state == "present" + +- name: GPG-Schlüssel für AnyDesks apt-Repo herunterladen und importieren + ansible.builtin.shell: | + set -euo pipefail + wget -qO - https://keys.anydesk.com/repos/DEB-GPG-KEY | gpg --dearmor -o /etc/apt/keyrings/anydesk.gpg + args: + creates: /etc/apt/keyrings/anydesk.gpg + executable: /bin/bash + when: tuxflotte_state == "present" + +- name: AnyDesks apt-Repo eintragen + ansible.builtin.apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/anydesk.gpg] http://deb.anydesk.com/ all main" + filename: anydesk-stable + state: present + update_cache: true + when: tuxflotte_state == "present" + +- name: AnyDesk installieren + ansible.builtin.apt: + name: anydesk + state: present + when: tuxflotte_state == "present" + +- name: Record that the anydesk role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/anydesk.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" + +- name: AnyDesk entfernen (Auftrag abgewählt) + ansible.builtin.apt: + name: anydesk + state: absent + when: tuxflotte_state == "absent" + +- name: AnyDesks apt-Repo entfernen (Auftrag abgewählt) + ansible.builtin.apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/anydesk.gpg] http://deb.anydesk.com/ all main" + filename: anydesk-stable + state: absent + when: tuxflotte_state == "absent" + +- name: anydesk-Marker entfernen (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/anydesk.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/gdevelop/defaults/main.yml b/roles/gdevelop/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/gdevelop/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/gdevelop/tasks/main.yml b/roles/gdevelop/tasks/main.yml new file mode 100644 index 0000000..7da1e86 --- /dev/null +++ b/roles/gdevelop/tasks/main.yml @@ -0,0 +1,45 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# GDevelop hat kein reguläres Debian/Ubuntu-Paket, Flathub-ID per +# Web-Recherche bestätigt (09.09.2026) - Flatpak-Fallback wie bei +# brave/libreoffice/onlyoffice (Migration 0009/0010/0013). + +- name: Ensure flathub remote is configured + community.general.flatpak_remote: + name: flathub + flatpakrepo_url: https://flathub.org/repo/flathub.flatpakrepo + state: present + method: system + when: tuxflotte_state == "present" + +- name: Install GDevelop via Flatpak + community.general.flatpak: + name: io.gdevelop.ide + remote: flathub + state: present + method: system + when: tuxflotte_state == "present" + +- name: Record that the gdevelop role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/gdevelop.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" + +- name: Remove GDevelop (Auftrag abgewählt) + community.general.flatpak: + name: io.gdevelop.ide + state: absent + method: system + when: tuxflotte_state == "absent" + +- name: Remove gdevelop marker (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/gdevelop.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/google-chrome/defaults/main.yml b/roles/google-chrome/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/google-chrome/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/google-chrome/tasks/main.yml b/roles/google-chrome/tasks/main.yml new file mode 100644 index 0000000..202c5aa --- /dev/null +++ b/roles/google-chrome/tasks/main.yml @@ -0,0 +1,59 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# Google Chrome gibt es nicht im Debian/Ubuntu-Repo (proprietär) - Googles +# eigenes apt-Repo ist aber distributionsunabhängig gepflegt (funktioniert +# gleichermaßen für Debian und Ubuntu, verifiziert 09.09.2026), deshalb ein +# einziger Rollencode für alle drei Backends, kein os_family-Zweig nötig. + +- name: GPG-Schlüssel für Googles apt-Repo herunterladen und importieren + ansible.builtin.shell: | + set -euo pipefail + wget -q https://dl.google.com/linux/linux_signing_key.pub -O- | gpg --dearmor -o /usr/share/keyrings/google-chrome.gpg + args: + creates: /usr/share/keyrings/google-chrome.gpg + executable: /bin/bash + when: tuxflotte_state == "present" + +- name: Googles apt-Repo eintragen + ansible.builtin.apt_repository: + repo: "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" + filename: google-chrome + state: present + update_cache: true + when: tuxflotte_state == "present" + +- name: Google Chrome installieren + ansible.builtin.apt: + name: google-chrome-stable + state: present + when: tuxflotte_state == "present" + +- name: Record that the google-chrome role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/google-chrome.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" + +- name: Google Chrome entfernen (Auftrag abgewählt) + ansible.builtin.apt: + name: google-chrome-stable + state: absent + when: tuxflotte_state == "absent" + +- name: Googles apt-Repo entfernen (Auftrag abgewählt) + ansible.builtin.apt_repository: + repo: "deb [arch=amd64 signed-by=/usr/share/keyrings/google-chrome.gpg] https://dl.google.com/linux/chrome/deb/ stable main" + filename: google-chrome + state: absent + when: tuxflotte_state == "absent" + +- name: google-chrome-Marker entfernen (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/google-chrome.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/kolibri/defaults/main.yml b/roles/kolibri/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/kolibri/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/kolibri/tasks/main.yml b/roles/kolibri/tasks/main.yml new file mode 100644 index 0000000..73ac4a1 --- /dev/null +++ b/roles/kolibri/tasks/main.yml @@ -0,0 +1,67 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# Kolibri (Learning Equality, Offline-Lernplattform) - nutzt das neuere, +# distributionsunabhängige apt-Repo (GitHub Pages, Suite "stable" statt +# eines distro-codename-gebundenen Repos wie die ältere Launchpad-PPA), +# offiziell für Debian 13+ dokumentiert (09.09.2026). NICHT live auf Mint/ +# Ubuntu getestet, ob dieses Repo dort ebenfalls funktioniert - falls nicht, +# müsste auf die ältere codename-gebundene Launchpad-PPA ausgewichen werden. +# Vor breitem Rollout auf einer echten Mint-/Ubuntu-Maschine gegenprüfen. + +- name: Verzeichnis /etc/apt/keyrings anlegen (falls noch nicht vorhanden) + ansible.builtin.file: + path: /etc/apt/keyrings + state: directory + mode: "0755" + when: tuxflotte_state == "present" + +- name: GPG-Schlüssel für Kolibris apt-Repo herunterladen + ansible.builtin.get_url: + url: https://learningequality.github.io/kolibri-installer-debian/pubkey.asc + dest: /etc/apt/keyrings/kolibri.asc + mode: "0644" + when: tuxflotte_state == "present" + +- name: Kolibris apt-Repo eintragen + ansible.builtin.apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/kolibri.asc] https://learningequality.github.io/kolibri-installer-debian/ stable main" + filename: kolibri + state: present + update_cache: true + when: tuxflotte_state == "present" + +- name: Kolibri installieren + ansible.builtin.apt: + name: kolibri + state: present + when: tuxflotte_state == "present" + +- name: Record that the kolibri role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/kolibri.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" + +- name: Kolibri entfernen (Auftrag abgewählt) + ansible.builtin.apt: + name: kolibri + state: absent + when: tuxflotte_state == "absent" + +- name: Kolibris apt-Repo entfernen (Auftrag abgewählt) + ansible.builtin.apt_repository: + repo: "deb [signed-by=/etc/apt/keyrings/kolibri.asc] https://learningequality.github.io/kolibri-installer-debian/ stable main" + filename: kolibri + state: absent + when: tuxflotte_state == "absent" + +- name: kolibri-Marker entfernen (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/kolibri.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/turbowarp/defaults/main.yml b/roles/turbowarp/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/turbowarp/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/turbowarp/tasks/main.yml b/roles/turbowarp/tasks/main.yml new file mode 100644 index 0000000..7fb04fd --- /dev/null +++ b/roles/turbowarp/tasks/main.yml @@ -0,0 +1,45 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# TurboWarp hat kein reguläres Debian/Ubuntu-Paket, Flathub-ID per +# Web-Recherche bestätigt (09.09.2026) - Flatpak-Fallback wie bei +# brave/libreoffice/onlyoffice (Migration 0009/0010/0013). + +- name: Ensure flathub remote is configured + community.general.flatpak_remote: + name: flathub + flatpakrepo_url: https://flathub.org/repo/flathub.flatpakrepo + state: present + method: system + when: tuxflotte_state == "present" + +- name: Install TurboWarp via Flatpak + community.general.flatpak: + name: org.turbowarp.TurboWarp + remote: flathub + state: present + method: system + when: tuxflotte_state == "present" + +- name: Record that the turbowarp role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/turbowarp.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" + +- name: Remove TurboWarp (Auftrag abgewählt) + community.general.flatpak: + name: org.turbowarp.TurboWarp + state: absent + method: system + when: tuxflotte_state == "absent" + +- name: Remove turbowarp marker (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/turbowarp.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/veyon/defaults/main.yml b/roles/veyon/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/veyon/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/veyon/tasks/main.yml b/roles/veyon/tasks/main.yml new file mode 100644 index 0000000..6b73c49 --- /dev/null +++ b/roles/veyon/tasks/main.yml @@ -0,0 +1,71 @@ +- name: Ensure marker directory exists + ansible.builtin.file: + path: /run/tuxflotte/agent/applied + state: directory + mode: "0755" + +# Veyon (Klassenraum-Management) - kein distributionsunabhängiges apt-Repo +# verfügbar, offizielle Downloads sind pro Distro/Version fest gebaute .deb- +# Dateien (github.com/veyon/veyon/releases, Version 4.11.2, Stand +# 09.09.2026). Zuordnung Backend -> Distro-Codename: +# - debian-image (Debian 13/trixie) -> debian.13 +# - mint-image (Linux Mint 22.3, basiert auf Ubuntu 24.04/noble) -> ubuntu.24.04 +# - ubuntu-image (Ubuntu 26.04/resolute) -> ubuntu.26.04 +# Codename-Erkennung über /etc/os-release: UBUNTU_CODENAME ist bei Ubuntu +# UND bei Mint gesetzt (Mint trägt den Ubuntu-Codename der Basis ein), bei +# reinem Debian fehlt es, dort zählt VERSION_CODENAME. NICHT live auf allen +# drei Golden-VMs gegengeprüft (nur Debian/trixie an dieser Stelle real +# bestätigt, siehe Session-Notizen) - vor breitem Rollout nachholen. +- name: Distro-Codename ermitteln (UBUNTU_CODENAME bevorzugt, sonst VERSION_CODENAME) + ansible.builtin.shell: | + set -euo pipefail + . /etc/os-release + echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}" + args: + executable: /bin/bash + register: tuxflotte_veyon_codename + changed_when: false + when: tuxflotte_state == "present" or tuxflotte_state == "absent" + +- name: Veyon-.deb-Dateiname je Codename festlegen + ansible.builtin.set_fact: + tuxflotte_veyon_deb: >- + {{ + { + 'trixie': 'veyon_4.11.2.0-debian.13_amd64.deb', + 'noble': 'veyon_4.11.2.0-ubuntu.24.04_amd64.deb', + 'resolute': 'veyon_4.11.2.0-ubuntu.26.04_amd64.deb' + }[tuxflotte_veyon_codename.stdout | trim] + }} + when: tuxflotte_state == "present" and (tuxflotte_veyon_codename.stdout | trim) in ['trixie', 'noble', 'resolute'] + +- name: Veyon installieren + ansible.builtin.apt: + deb: "https://github.com/veyon/veyon/releases/download/v4.11.2/{{ tuxflotte_veyon_deb }}" + when: tuxflotte_state == "present" and tuxflotte_veyon_deb is defined + +- name: Warnung falls Codename unbekannt (kein passendes Veyon-Paket) + ansible.builtin.debug: + msg: >- + Veyon: Distro-Codename '{{ tuxflotte_veyon_codename.stdout | trim }}' nicht in der + bekannten Zuordnung - Installation übersprungen, bitte Rolle aktualisieren. + when: tuxflotte_state == "present" and tuxflotte_veyon_deb is not defined + +- name: Record that the veyon role ran + ansible.builtin.copy: + dest: /run/tuxflotte/agent/applied/veyon.marker + content: "{{ ansible_date_time.iso8601 }}\n" + mode: "0644" + when: tuxflotte_state == "present" and tuxflotte_veyon_deb is defined + +- name: Veyon entfernen (Auftrag abgewählt) + ansible.builtin.apt: + name: veyon + state: absent + when: tuxflotte_state == "absent" + +- name: veyon-Marker entfernen (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/veyon.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/site.yml b/site.yml index 0b267f5..aadf5ae 100644 --- a/site.yml +++ b/site.yml @@ -308,3 +308,57 @@ tuxflotte_state: "{{ tuxflotte_auftrag_states.get('marble', 'present') }}" tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('marble', {}) }}" tags: marble + + - include_role: + name: google-chrome + apply: + tags: google-chrome + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('google-chrome', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('google-chrome', {}) }}" + tags: google-chrome + + - include_role: + name: anydesk + apply: + tags: anydesk + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('anydesk', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('anydesk', {}) }}" + tags: anydesk + + - include_role: + name: kolibri + apply: + tags: kolibri + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kolibri', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kolibri', {}) }}" + tags: kolibri + + - include_role: + name: veyon + apply: + tags: veyon + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('veyon', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('veyon', {}) }}" + tags: veyon + + - include_role: + name: gdevelop + apply: + tags: gdevelop + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('gdevelop', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('gdevelop', {}) }}" + tags: gdevelop + + - include_role: + name: turbowarp + apply: + tags: turbowarp + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('turbowarp', 'present') }}" + tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('turbowarp', {}) }}" + tags: turbowarp