feat: echte Rolleninhalte für guest-session/brave-fedora/onlyoffice-fedora

Ersetzt die reinen Marker-Datei-Platzhalter durch echte Anforderungen des
Schulcomputer-Workspace:

- guest-session: flüchtige Gastsitzung über lokalen gast-User +
  pam_namespace-tmpfs-Polyinstantiation, nopasswdlogin-Login. PAM-Layout
  wird über ansible_facts os_family erkannt (RedHat vs. Debian), da der
  Rollenname für beide Backends geteilt wird.
- brave-fedora: Installation via Flatpak/Flathub, neue optionale
  standardbrowser-Option (tuxflotte_optionen) setzt/entfernt den
  System-Default in /etc/xdg/mimeapps.list, mit Firefox-Fallback.
- onlyoffice-fedora: Installation via Flatpak/Flathub.

site.yml reicht zusätzlich zu tuxflotte_auftrag_states auch
tuxflotte_auftrag_optionen pro Rolle durch.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Thomas Stallinger 2026-08-04 15:28:57 +02:00
parent 28e6c067a1
commit 770c3a6c95
6 changed files with 189 additions and 1 deletions

View File

@ -12,7 +12,13 @@ ansible-pull -U <repo-url> --tags <rolle1>,<rolle2>,... -i localhost, site.yml
## Aktueller Stand ## Aktueller Stand
Alle Rollen sind Platzhalter — sie hinterlegen nur eine Marker-Datei unter `/run/tuxflotte/agent/applied/<rolle>.marker`, um die End-to-End-Pipeline (Server → Agent → ansible-pull → Rolle) nachzuweisen. Echte Rolleninhalte folgen später. Alle drei Rollen haben echten Inhalt (Stand 2026-08-04) — die Marker-Dateien unter `/run/tuxflotte/agent/applied/<rolle>.marker` bleiben zusätzlich als schneller E2E-Nachweis bestehen, sind aber nicht mehr der eigentliche Effekt der Rollen:
- **`guest-session`**: echte flüchtige Gastsitzung. Lokaler User `gast`, Login ohne Passwort über die `nopasswdlogin`-Gruppenkonvention, `$HOME` per `pam_namespace`-Polyinstantiation (`/etc/security/namespace.conf`) als tmpfs — wird bei Sitzungsende automatisch verworfen, kein Cleanup-Skript nötig. PAM-Dateilayout unterscheidet sich zwischen RedHat- (`gdm-password`/`postlogin`) und Debian-Familie (`lightdm`/`common-session`) und wird über `ansible_facts['os_family']` erkannt, da derselbe Rollenname für beide Backends (`fedora`, `mint`) verwendet wird.
- **`brave-fedora`**: Installation von Brave via Flatpak/Flathub (`community.general.flatpak`). Unterstützt zusätzlich die Auftragskatalog-Option `standardbrowser` (siehe unten).
- **`onlyoffice-fedora`**: Installation von OnlyOffice Desktop Editors via Flatpak/Flathub.
**Neue Abhängigkeit:** die `community.general`-Collection (Module `flatpak`, `flatpak_remote`, `ini_file`). Auf der Zielplattform muss sie installiert sein — auf der bisherigen Test-VM (Linux Mint) bereits vorhanden (`ansible-collection-community-general`), auf frisch installierten Fedora-Geräten ggf. per `ansible-galaxy collection install community.general` oder passendes RPM-Paket sicherstellen.
## present/absent (Auftragskatalog, ADR-0010) ## present/absent (Auftragskatalog, ADR-0010)
@ -36,6 +42,12 @@ Jede Rolle, die katalogfähig werden soll, muss deshalb ihre Tasks auf `tuxflott
Rollen, die nie katalogfähig werden (rein workspace-komponierte Merkmale), brauchen keinen `absent`-Zweig — das ist bewusst kein Zwang für alle Rollen, nur für die, die tatsächlich im Auftragskatalog landen. Rollen, die nie katalogfähig werden (rein workspace-komponierte Merkmale), brauchen keinen `absent`-Zweig — das ist bewusst kein Zwang für alle Rollen, nur für die, die tatsächlich im Auftragskatalog landen.
## optionen (Auswahl-Parameter je Zuweisung)
Über die reine present/absent-Zuweisung hinaus kann eine Auftragskatalog-Zuweisung zusätzliche, rollenspezifische Optionen tragen (`device_merkmale.optionen`, JSONB) — z.B. `{"standardbrowser": true}` bei `browser-brave`. Der Server kennt die Bedeutung dieser Optionen nicht, reicht sie nur unverändert durch (Check-in-Antwort `auftraege[].optionen`).
Der Agent baut daraus `tuxflotte_auftrag_optionen` (Rollenname → optionen-Dict) als zweites `--extra-vars`-Feld neben `tuxflotte_auftrag_states`. `site.yml` reicht es pro Rolle als `tuxflotte_optionen` durch (Default `{}`, falls die Rolle nicht in der Map auftaucht). Nur Rollen, die tatsächlich Optionen brauchen, lesen die Variable (aktuell nur `brave-fedora`) — für alle anderen ist sie ungenutzt.
## Neue Rolle hinzufügen ## Neue Rolle hinzufügen
1. `roles/<name>/tasks/main.yml` anlegen 1. `roles/<name>/tasks/main.yml` anlegen

View File

@ -1 +1,2 @@
tuxflotte_state: present tuxflotte_state: present
tuxflotte_optionen: {}

View File

@ -4,6 +4,68 @@
state: directory state: directory
mode: "0755" mode: "0755"
- 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 Brave via Flatpak
community.general.flatpak:
name: com.brave.Browser
remote: flathub
state: present
method: system
when: tuxflotte_state == "present"
# Systemweiter Default (nicht pro Benutzer), da ansible-pull als root ohne
# Sitzungskontext läuft. /etc/xdg/mimeapps.list gilt für jeden Benutzer ohne
# eigene ~/.config/mimeapps.list. Jeder Lauf erzwingt deterministisch einen
# der beiden Werte - kein Tracking, ob ein Admin manuell etwas anderes
# gesetzt hat (bekannte Einschränkung, siehe README).
- name: Set Brave as system default browser (standardbrowser-Option aktiv)
community.general.ini_file:
path: /etc/xdg/mimeapps.list
section: Default Applications
option: "{{ item }}"
value: com.brave.Browser.desktop
mode: "0644"
no_extra_spaces: true
loop:
- text/html
- x-scheme-handler/http
- x-scheme-handler/https
when: tuxflotte_state == "present" and (tuxflotte_optionen.standardbrowser | default(false))
# Nur zurücksetzen, wenn Brave aktuell tatsächlich als Default eingetragen
# ist - sonst würde jeder Lauf auf jedem Gerät ohne Brave-Auswahl einen
# eventuell fremd (manuell) gesetzten Standardbrowser überschreiben.
- name: Check whether Brave is currently the configured default browser
ansible.builtin.command:
cmd: grep -q com.brave.Browser.desktop /etc/xdg/mimeapps.list
register: tuxflotte_brave_is_default
changed_when: false
failed_when: false
when: tuxflotte_state == "absent" or not (tuxflotte_optionen.standardbrowser | default(false))
- name: Reset default browser to Firefox (standardbrowser-Option inaktiv oder Auftrag abgewählt)
community.general.ini_file:
path: /etc/xdg/mimeapps.list
section: Default Applications
option: "{{ item }}"
value: firefox.desktop
mode: "0644"
no_extra_spaces: true
loop:
- text/html
- x-scheme-handler/http
- x-scheme-handler/https
when: >
(tuxflotte_state == "absent" or not (tuxflotte_optionen.standardbrowser | default(false)))
and tuxflotte_brave_is_default.rc is defined and tuxflotte_brave_is_default.rc == 0
- name: Record that the brave-fedora role ran - name: Record that the brave-fedora role ran
ansible.builtin.copy: ansible.builtin.copy:
dest: /run/tuxflotte/agent/applied/brave-fedora.marker dest: /run/tuxflotte/agent/applied/brave-fedora.marker
@ -11,6 +73,13 @@
mode: "0644" mode: "0644"
when: tuxflotte_state == "present" when: tuxflotte_state == "present"
- name: Remove Brave Flatpak (Auftrag abgewählt)
community.general.flatpak:
name: com.brave.Browser
state: absent
method: system
when: tuxflotte_state == "absent"
- name: Remove brave-fedora marker (Auftrag abgewählt) - name: Remove brave-fedora marker (Auftrag abgewählt)
ansible.builtin.file: ansible.builtin.file:
path: /run/tuxflotte/agent/applied/brave-fedora.marker path: /run/tuxflotte/agent/applied/brave-fedora.marker

View File

@ -4,6 +4,56 @@
state: directory state: directory
mode: "0755" mode: "0755"
# PAM-Dateilayout unterscheidet sich zwischen RedHat- (GDM/authselect) und
# Debian-Familie (LightDM/common-*) - beide Backends (fedora, mint) nutzen
# denselben Rollennamen "guest-session" (siehe blueprints-Seed), die Rolle
# muss also auf beiden funktionieren.
- name: Determine PAM file locations for this distribution family
ansible.builtin.set_fact:
tuxflotte_guest_pam_auth_file: "{{ '/etc/pam.d/gdm-password' if ansible_facts['os_family'] == 'RedHat' else '/etc/pam.d/lightdm' }}"
tuxflotte_guest_pam_session_file: "{{ '/etc/pam.d/postlogin' if ansible_facts['os_family'] == 'RedHat' else '/etc/pam.d/common-session' }}"
- name: Ensure nopasswdlogin group exists (present)
ansible.builtin.group:
name: nopasswdlogin
state: present
when: tuxflotte_state == "present"
- name: Ensure gast user exists (present)
ansible.builtin.user:
name: gast
comment: "Tuxflotte Gastsitzung"
groups: nopasswdlogin
append: true
shell: /bin/bash
password_lock: true
when: tuxflotte_state == "present"
# Debian/LightDM bringt diese Zeile bereits standardmäßig mit (idempotent,
# lineinfile dupliziert nicht) - auf Fedora/GDM muss sie ergänzt werden.
- name: Allow passwordless login for nopasswdlogin group
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_auth_file }}"
line: "auth sufficient pam_succeed_if.so user ingroup nopasswdlogin"
insertbefore: BOF
state: present
when: tuxflotte_state == "present"
- name: Ensure ephemeral tmpfs home for gast (pam_namespace polyinstantiation)
ansible.builtin.lineinfile:
path: /etc/security/namespace.conf
line: "/home/gast tmpfs tmpfs:mntopts=size=2G,mode=0700 root,gast"
regexp: '^/home/gast\s'
state: present
when: tuxflotte_state == "present"
- name: Enable pam_namespace for login sessions
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_session_file }}"
line: "session required pam_namespace.so"
state: present
when: tuxflotte_state == "present"
- name: Record that the guest-session role ran - name: Record that the guest-session role ran
ansible.builtin.copy: ansible.builtin.copy:
dest: /run/tuxflotte/agent/applied/guest-session.marker dest: /run/tuxflotte/agent/applied/guest-session.marker
@ -11,6 +61,32 @@
mode: "0644" mode: "0644"
when: tuxflotte_state == "present" when: tuxflotte_state == "present"
- name: Remove ephemeral tmpfs home entry for gast (Auftrag abgewählt)
ansible.builtin.lineinfile:
path: /etc/security/namespace.conf
regexp: '^/home/gast\s'
state: absent
when: tuxflotte_state == "absent"
# Entfernt die nopasswdlogin-Regel vollständig, nicht nur den gast-Account -
# betrifft auf Debian/LightDM auch den distributionseigenen Default-Eintrag.
# Bewusst in Kauf genommen: diese Rolle ist der einzige Verwalter der
# nopasswdlogin-Konvention in diesem Katalog, Wiederherstellung beim
# nächsten present-Lauf ist kostenlos.
- name: Remove passwordless login rule for nopasswdlogin group (Auftrag abgewählt)
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_auth_file }}"
line: "auth sufficient pam_succeed_if.so user ingroup nopasswdlogin"
state: absent
when: tuxflotte_state == "absent"
- name: Remove gast user and home (Auftrag abgewählt)
ansible.builtin.user:
name: gast
state: absent
remove: true
when: tuxflotte_state == "absent"
- name: Remove guest-session marker (Auftrag abgewählt) - name: Remove guest-session marker (Auftrag abgewählt)
ansible.builtin.file: ansible.builtin.file:
path: /run/tuxflotte/agent/applied/guest-session.marker path: /run/tuxflotte/agent/applied/guest-session.marker

View File

@ -4,6 +4,22 @@
state: directory state: directory
mode: "0755" mode: "0755"
- 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 OnlyOffice via Flatpak
community.general.flatpak:
name: org.onlyoffice.desktopeditors
remote: flathub
state: present
method: system
when: tuxflotte_state == "present"
- name: Record that the onlyoffice-fedora role ran - name: Record that the onlyoffice-fedora role ran
ansible.builtin.copy: ansible.builtin.copy:
dest: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker dest: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker
@ -11,6 +27,13 @@
mode: "0644" mode: "0644"
when: tuxflotte_state == "present" when: tuxflotte_state == "present"
- name: Remove OnlyOffice Flatpak (Auftrag abgewählt)
community.general.flatpak:
name: org.onlyoffice.desktopeditors
state: absent
method: system
when: tuxflotte_state == "absent"
- name: Remove onlyoffice-fedora marker (Auftrag abgewählt) - name: Remove onlyoffice-fedora marker (Auftrag abgewählt)
ansible.builtin.file: ansible.builtin.file:
path: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker path: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker

View File

@ -7,6 +7,10 @@
# die hier nicht auftauchen (z.B. weil sie nur workspace-komponiert sind), # die hier nicht auftauchen (z.B. weil sie nur workspace-komponiert sind),
# bleiben beim Default "present" - unverändert additives Verhalten. # bleiben beim Default "present" - unverändert additives Verhalten.
tuxflotte_auftrag_states: {} tuxflotte_auftrag_states: {}
# Rollenname -> optionen-Dict aus der Auswahl-API (device_merkmale.optionen),
# z.B. {"standardbrowser": true} bei brave-fedora. Rein additiv, opak für
# den Server/Agenten - nur die jeweilige Rolle kennt die Bedeutung.
tuxflotte_auftrag_optionen: {}
tasks: tasks:
- include_role: - include_role:
name: guest-session name: guest-session
@ -14,6 +18,7 @@
tags: guest-session tags: guest-session
vars: vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('guest-session', 'present') }}" tuxflotte_state: "{{ tuxflotte_auftrag_states.get('guest-session', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('guest-session', {}) }}"
tags: guest-session tags: guest-session
- include_role: - include_role:
@ -22,6 +27,7 @@
tags: brave-fedora tags: brave-fedora
vars: vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('brave-fedora', 'present') }}" tuxflotte_state: "{{ tuxflotte_auftrag_states.get('brave-fedora', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('brave-fedora', {}) }}"
tags: brave-fedora tags: brave-fedora
- include_role: - include_role:
@ -30,4 +36,5 @@
tags: onlyoffice-fedora tags: onlyoffice-fedora
vars: vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('onlyoffice-fedora', 'present') }}" tuxflotte_state: "{{ tuxflotte_auftrag_states.get('onlyoffice-fedora', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('onlyoffice-fedora', {}) }}"
tags: onlyoffice-fedora tags: onlyoffice-fedora