Files
ansible-content-stabil/site.yml
T
adminandClaude Sonnet 5 553117466b Phase 2: 10 neue Konfiguration/Härtung-Merkmale (erste Batch)
Konfiguration: multimedia-codecs, barrierefreiheit, wlan-firmware,
tastaturlayout, laender, zeitserver, auto-update.
Härtung: firewall, virenscanner, security-updates.

Vier Config-Value-Rollen (tastaturlayout/laender/zeitserver/auto-update)
nutzen tuxflotte_optionen fuer den eigentlichen Wert (Muster wie
brave/standardbrowser), nicht nur present/absent.

ECHT auf golden-linux-mint getestet (ansible-core dort, Live-VM ueber
SSH), nicht nur Syntax-Check - dabei drei reale Bugs gefunden+behoben:

1. wlan-firmware: Paketname ist NICHT distributionsunabhaengig wie
   angenommen - Debian "firmware-linux-nonfree", Ubuntu/Mint
   "linux-firmware". Per ansible_facts[distribution] verzweigt (dabei
   zusaetzlich gelernt: Mint meldet sich als "Linux Mint" mit
   Leerzeichen, nicht "Linuxmint").
2. auto-update: Jinja-Dict-Lookup in set_fact lieferte einen String
   statt int zurueck, dadurch spaeterer Vergleich mit TypeError
   abgestuerzt UND zwei stille Gleichheitsvergleiche immer falsch
   (waeren nie aufgefallen ohne den einen lauten Fehler an anderer
   Stelle). Mit explizitem int-Filter behoben.
3. firewall/security-updates: Auftrag-abgewaehlt deaktivierte nur die
   Funktion (ufw disable / Config-Datei loeschen), liess aber das Paket
   installiert - inkonsistent zum Rest des Katalogs, wo absent immer
   vollstaendige Rueckabwicklung bedeutet. Ergaenzt.

Nebenbefund beim Testen: clamav-daemon startet bewusst nicht sofort nach
der Installation (echte systemd-Condition auf die noch fehlende
Signaturdatenbank) - kein Bug, aber clamav-freshclam war standardmaessig
nicht dauerhaft aktiviert, das nachgezogen.

Firewall-Rolle laesst SSH bewusst offen (sonst waere Fernwartung
ausgesperrt - fast selbst beim Testen passiert). Bekannte offene Luecke
klar kommentiert: andere Merkmale mit Eingehend-Bedarf (z.B. veyon)
muessen ihre eigene ufw-Freigabe mitbringen, diese Rolle kennt andere
Merkmale nicht (Konflikt-/Gruppen-Handling insgesamt noch offen, siehe
Roadmap).

Gehoert zusammen mit admin/provisioning-server-Migration 0035 (live auf
anode angewendet+verifiziert: 10 Merkmale, 30 Blueprint-Zeilen) und den
3 neuen Kategorien aus Migration 0034.

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

468 lines
15 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
- include_role:
name: multimedia-codecs
apply:
tags: multimedia-codecs
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('multimedia-codecs', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('multimedia-codecs', {}) }}"
tags: multimedia-codecs
- include_role:
name: barrierefreiheit
apply:
tags: barrierefreiheit
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('barrierefreiheit', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('barrierefreiheit', {}) }}"
tags: barrierefreiheit
- include_role:
name: wlan-firmware
apply:
tags: wlan-firmware
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('wlan-firmware', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('wlan-firmware', {}) }}"
tags: wlan-firmware
- include_role:
name: firewall
apply:
tags: firewall
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('firewall', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('firewall', {}) }}"
tags: firewall
- include_role:
name: virenscanner
apply:
tags: virenscanner
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('virenscanner', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('virenscanner', {}) }}"
tags: virenscanner
- include_role:
name: security-updates
apply:
tags: security-updates
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('security-updates', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('security-updates', {}) }}"
tags: security-updates
- include_role:
name: tastaturlayout
apply:
tags: tastaturlayout
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('tastaturlayout', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('tastaturlayout', {}) }}"
tags: tastaturlayout
- include_role:
name: laender
apply:
tags: laender
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('laender', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('laender', {}) }}"
tags: laender
- include_role:
name: zeitserver
apply:
tags: zeitserver
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('zeitserver', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('zeitserver', {}) }}"
tags: zeitserver
- include_role:
name: auto-update
apply:
tags: auto-update
vars:
tuxflotte_state: "{{ tuxflotte_auftrag_states.get('auto-update', 'present') }}"
tuxflotte_optionen: "{{ tuxflotte_auftrag_optionen.get('auto-update', {}) }}"
tags: auto-update