Files
ansible-content-stabil/site.yml
T
adminandClaude Sonnet 5 e4edcf1011 Webapp-Mechanismus (Phase 2): neue Rolle webapp-shortcuts
Kundeneigene URLs (workspace_webapps, siehe admin/provisioning-server)
werden als .desktop-Menueintrag (/usr/share/applications) UND
best-effort als Desktop-Icon ausgeliefert - kein present/absent pro
Eintrag wie sonst im Katalog, sondern ein echter ABGLEICH: die Rolle
bekommt bei jedem Lauf die komplette aktuelle Liste und sorgt dafuer,
dass GENAU diese Eintraege existieren (Datei-Identifikation ueber die
stabile DB-UUID, keine Namens-Slugifizierung noetig). Laeuft deshalb
IMMER (site.yml-Play-Var tuxflotte_webapps, agent.py haengt sie immer
in --tags ein, siehe admin/provisioning-agent), nicht nur bei
Aenderungen.

Desktop-Icon-Ablage bewusst pragmatisch: /etc/skel/Desktop (kuenftige
Nutzer) + bestehende /home/*/Desktop-Ordner, falls schon vorhanden -
kein erzwungenes Anlegen. Haengt an der noch offenen ADR-0026
(kein final festgelegter primaerer interaktiver Nutzer-Account) - deckt
ab, was heute real existiert (z.B. den 'gast'-Account aus
guest-session), ohne auf die endgueltige Klaerung zu warten.

ECHT END-ZU-ENDE GETESTET (nicht nur Syntax-Check): echter
ansible-playbook-Lauf gegen localhost mit Mock-Daten - Anlegen
(mit+ohne Favicon), Aktualisieren, vollstaendiges Entfernen bei leerer
Liste, Idempotenz. Favicon-Download-Pfad mit echter URL verifiziert.
ansible-core dafuer neu installiert (vorher nicht vorhanden).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-09 14:59:09 +02:00

378 lines
12 KiB
YAML

- hosts: localhost
connection: local
become: true
vars:
# Vom Agenten per --extra-vars gesetzt (siehe ADR-0010, provisioning-server
# Check-in-Response "auftraege"): Rollenname -> "present"/"absent". Rollen,
# die hier nicht auftauchen (z.B. weil sie nur workspace-komponiert sind),
# bleiben beim Default "present" - unverändert additives Verhalten.
tuxflotte_auftrag_states: {}
# Rollenname -> optionen-Dict aus der Auswahl-API (device_merkmale.optionen),
# z.B. {"standardbrowser": true} bei brave. Rein additiv, opak für den
# Server/Agenten - nur die jeweilige Rolle kennt die Bedeutung.
tuxflotte_auftrag_optionen: {}
# Vom Agenten per --extra-vars gesetzt (Check-in-Response "webapps",
# Phase 2 09.09.2026): Liste kundeneigener {id, name, url, icon_url}-
# Einträge, verarbeitet ausschließlich von der webapp-shortcuts-Rolle
# (siehe dort) - kein present/absent-Merkmal wie der Rest dieser Datei.
tuxflotte_webapps: []
tasks:
- include_role:
name: guest-session
apply:
tags: guest-session
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('guest-session', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('guest-session', {}) }}"
tags: guest-session
- include_role:
name: brave
apply:
tags: brave
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('brave', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('brave', {}) }}"
tags: brave
- include_role:
name: onlyoffice
apply:
tags: onlyoffice
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('onlyoffice', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('onlyoffice', {}) }}"
tags: onlyoffice
- include_role:
name: libreoffice
apply:
tags: libreoffice
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('libreoffice', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('libreoffice', {}) }}"
tags: libreoffice
- include_role:
name: google-earth
apply:
tags: google-earth
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('google-earth', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('google-earth', {}) }}"
tags: google-earth
- include_role:
name: gimp
apply:
tags: gimp
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('gimp', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('gimp', {}) }}"
tags: gimp
- include_role:
name: inkscape
apply:
tags: inkscape
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('inkscape', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('inkscape', {}) }}"
tags: inkscape
- include_role:
name: scribus
apply:
tags: scribus
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('scribus', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('scribus', {}) }}"
tags: scribus
- include_role:
name: librecad
apply:
tags: librecad
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('librecad', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('librecad', {}) }}"
tags: librecad
- include_role:
name: audacity
apply:
tags: audacity
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('audacity', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('audacity', {}) }}"
tags: audacity
- include_role:
name: musescore
apply:
tags: musescore
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('musescore', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('musescore', {}) }}"
tags: musescore
- include_role:
name: metronome
apply:
tags: metronome
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('metronome', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('metronome', {}) }}"
tags: metronome
- include_role:
name: minuet
apply:
tags: minuet
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('minuet', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('minuet', {}) }}"
tags: minuet
- include_role:
name: stellarium
apply:
tags: stellarium
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('stellarium', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('stellarium', {}) }}"
tags: stellarium
- include_role:
name: octave
apply:
tags: octave
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('octave', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('octave', {}) }}"
tags: octave
- include_role:
name: kalgebra
apply:
tags: kalgebra
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kalgebra', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kalgebra', {}) }}"
tags: kalgebra
- include_role:
name: kalzium
apply:
tags: kalzium
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kalzium', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kalzium', {}) }}"
tags: kalzium
- include_role:
name: kbruch
apply:
tags: kbruch
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kbruch', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kbruch', {}) }}"
tags: kbruch
- include_role:
name: step
apply:
tags: step
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('step', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('step', {}) }}"
tags: step
- include_role:
name: tuxmath
apply:
tags: tuxmath
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('tuxmath', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('tuxmath', {}) }}"
tags: tuxmath
- include_role:
name: filius
apply:
tags: filius
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('filius', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('filius', {}) }}"
tags: filius
- include_role:
name: gcompris
apply:
tags: gcompris
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('gcompris', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('gcompris', {}) }}"
tags: gcompris
- include_role:
name: ktouch
apply:
tags: ktouch
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('ktouch', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('ktouch', {}) }}"
tags: ktouch
- include_role:
name: kwordquiz
apply:
tags: kwordquiz
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kwordquiz', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kwordquiz', {}) }}"
tags: kwordquiz
- include_role:
name: kanagram
apply:
tags: kanagram
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kanagram', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kanagram', {}) }}"
tags: kanagram
- include_role:
name: tuxtype
apply:
tags: tuxtype
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('tuxtype', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('tuxtype', {}) }}"
tags: tuxtype
- include_role:
name: foliate
apply:
tags: foliate
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('foliate', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('foliate', {}) }}"
tags: foliate
- include_role:
name: evolution
apply:
tags: evolution
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('evolution', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('evolution', {}) }}"
tags: evolution
- include_role:
name: kturtle
apply:
tags: kturtle
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('kturtle', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('kturtle', {}) }}"
tags: kturtle
- include_role:
name: fritzing
apply:
tags: fritzing
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('fritzing', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('fritzing', {}) }}"
tags: fritzing
- include_role:
name: remmina
apply:
tags: remmina
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('remmina', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('remmina', {}) }}"
tags: remmina
- include_role:
name: geogebra
apply:
tags: geogebra
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('geogebra', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('geogebra', {}) }}"
tags: geogebra
- include_role:
name: marble
apply:
tags: marble
vars:
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
- include_role:
name: webapp-shortcuts
apply:
tags: webapp-shortcuts
vars:
tuxflotte_webapps: "{{ tuxflotte_webapps }}"
tags: webapp-shortcuts