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
378 lines
12 KiB
YAML
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
|