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:
parent
28e6c067a1
commit
770c3a6c95
14
README.md
14
README.md
@ -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
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
tuxflotte_state: present
|
tuxflotte_state: present
|
||||||
|
tuxflotte_optionen: {}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
7
site.yml
7
site.yml
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user