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
This commit is contained in:
1 parent
e4edcf1011
commit
553117466b
21 files changed
+663
No files matched your search
@@ -0,0 +1,3 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
|
tuxflotte_optionen:
|
||||||
|
intervall: woechentlich
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# Allgemeine Update-Taktung (nicht zu verwechseln mit der Rolle
|
||||||
|
# "security-updates", die als eigenständiges Härtungs-Merkmal NUR
|
||||||
|
# Security-Patches automatisiert - diese Rolle steuert die Taktung für
|
||||||
|
# ALLE Paketaktualisierungen). Nutzt denselben apt-Periodic-Mechanismus,
|
||||||
|
# aber eine ANDERE Datei (10periodic statt 20auto-upgrades), damit sich
|
||||||
|
# beide Rollen nicht gegenseitig überschreiben.
|
||||||
|
# tuxflotte_optionen.intervall: taeglich/woechentlich/monatlich/manuell
|
||||||
|
# (Default woechentlich) - "manuell" deaktiviert die automatische
|
||||||
|
# Aktualisierung komplett (Tage=0), App-Auswahl/Zeitpunkt bleibt beim
|
||||||
|
# Nutzer.
|
||||||
|
#
|
||||||
|
# App-Update (Flatpak): flatpak selbst bringt keinen automatischen
|
||||||
|
# Hintergrund-Update-Mechanismus mit (anders als apt) - ein eigener
|
||||||
|
# systemd-Timer mit derselben Taktung übernimmt das hier mit, falls
|
||||||
|
# Flatpak auf dem Gerät installiert ist (mehrere App-Store-Merkmale nutzen
|
||||||
|
# es, siehe brave/gdevelop/turbowarp).
|
||||||
|
|
||||||
|
- name: Taktung in Tagen aus der Option ableiten
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
tuxflotte_update_tage: >-
|
||||||
|
{{
|
||||||
|
{'taeglich': 1, 'woechentlich': 7, 'monatlich': 30, 'manuell': 0}[
|
||||||
|
tuxflotte_optionen.intervall | default('woechentlich')
|
||||||
|
]
|
||||||
|
}}
|
||||||
|
|
||||||
|
- name: apt-Periodic-Taktung setzen
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/apt/apt.conf.d/10periodic
|
||||||
|
content: |
|
||||||
|
APT::Periodic::Update-Package-Lists "{{ tuxflotte_update_tage }}";
|
||||||
|
APT::Periodic::Download-Upgradeable-Packages "{{ tuxflotte_update_tage }}";
|
||||||
|
APT::Periodic::AutocleanInterval "{{ tuxflotte_update_tage }}";
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Prüfen, ob Flatpak installiert ist
|
||||||
|
ansible.builtin.stat:
|
||||||
|
path: /usr/bin/flatpak
|
||||||
|
register: tuxflotte_flatpak_binary
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Flatpak-Auto-Update-Timer einrichten (falls Flatpak vorhanden)
|
||||||
|
ansible.builtin.cron:
|
||||||
|
name: "tuxflotte-flatpak-auto-update"
|
||||||
|
special_time: "{{ 'daily' if (tuxflotte_update_tage | int) == 1 else 'weekly' if (tuxflotte_update_tage | int) == 7 else 'monthly' }}"
|
||||||
|
job: "/usr/bin/flatpak update --noninteractive"
|
||||||
|
when: tuxflotte_state == "present" and tuxflotte_flatpak_binary.stat.exists and (tuxflotte_update_tage | int) > 0
|
||||||
|
|
||||||
|
- name: Flatpak-Auto-Update-Timer entfernen (falls "manuell" gewählt)
|
||||||
|
ansible.builtin.cron:
|
||||||
|
name: "tuxflotte-flatpak-auto-update"
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "present" and (tuxflotte_update_tage | int) == 0
|
||||||
|
|
||||||
|
- name: Record that the auto-update role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/auto-update.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}: {{ tuxflotte_optionen.intervall | default('woechentlich') }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: apt-Periodic-Taktung entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/apt/apt.conf.d/10periodic
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: Flatpak-Auto-Update-Timer entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.cron:
|
||||||
|
name: "tuxflotte-flatpak-auto-update"
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: auto-update-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/auto-update.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# Bildschirmleser (orca) + Bildschirmtastatur (onboard) - beide regulaere
|
||||||
|
# Debian/Ubuntu-Pakete, apt-cache verifiziert (10.09.2026). Lupe/Kontrast-
|
||||||
|
# Themes sind bereits Teil der jeweiligen Desktop-Umgebung, kein separates
|
||||||
|
# Paket noetig.
|
||||||
|
|
||||||
|
- name: Barrierefreiheits-Werkzeuge installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- orca
|
||||||
|
- onboard
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the barrierefreiheit role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/barrierefreiheit.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Barrierefreiheits-Werkzeuge entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- orca
|
||||||
|
- onboard
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: barrierefreiheit-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/barrierefreiheit.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# ufw (Uncomplicated Firewall) - regulaeres Debian/Ubuntu-Paket. Default-
|
||||||
|
# Politik bewusst "eingehend verweigern, ausgehend erlauben" (Standard-
|
||||||
|
# Empfehlung fuer Client-Geraete, kein Server-Dienst zu schuetzen) - reine
|
||||||
|
# Installation ohne Aktivierung waere wirkungslos, deshalb hier explizit
|
||||||
|
# "ufw enable" mit ausgefuehrt. SSH bleibt bewusst erlaubt (Fernwartung/
|
||||||
|
# IT-Zugriff bleibt sonst nach dem ersten Lauf ausgesperrt - live beim
|
||||||
|
# Testen selbst fast passiert).
|
||||||
|
#
|
||||||
|
# WICHTIG, noch offen (Konflikt-/Gruppen-Handling, siehe Roadmap-Doc):
|
||||||
|
# andere Merkmale, die eingehende Verbindungen brauchen (z.B. veyon, siehe
|
||||||
|
# roles/veyon/), muessen ihre eigene ufw-Freigabe SELBST mitbringen -
|
||||||
|
# diese Rolle kennt andere Merkmale nicht und kann das nicht automatisch
|
||||||
|
# koordinieren.
|
||||||
|
|
||||||
|
- name: ufw installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: ufw
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Default-Politik setzen (eingehend verweigern, ausgehend erlauben)
|
||||||
|
community.general.ufw:
|
||||||
|
direction: "{{ item.direction }}"
|
||||||
|
policy: "{{ item.policy }}"
|
||||||
|
loop:
|
||||||
|
- { direction: incoming, policy: deny }
|
||||||
|
- { direction: outgoing, policy: allow }
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: SSH weiterhin erlauben (Fernwartung)
|
||||||
|
community.general.ufw:
|
||||||
|
rule: allow
|
||||||
|
name: OpenSSH
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: ufw aktivieren
|
||||||
|
community.general.ufw:
|
||||||
|
state: enabled
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the firewall role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/firewall.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: ufw deaktivieren (Auftrag abgewählt)
|
||||||
|
community.general.ufw:
|
||||||
|
state: disabled
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
# Live beim Testen gefunden (10.09.2026): "deaktivieren" allein liess das
|
||||||
|
# Paket installiert stehen - inkonsistent zum Rest des Katalogs, wo
|
||||||
|
# "absent" immer eine vollstaendige Rueckabwicklung bedeutet.
|
||||||
|
- name: ufw entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: ufw
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: firewall-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/firewall.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
|
tuxflotte_optionen:
|
||||||
|
land: DE
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# Länder-/Regionaleinstellung (Systemsprache/Locale) - tuxflotte_optionen.land
|
||||||
|
# aus einer kleinen, erweiterbaren Ländertabelle auf ein konkretes Locale
|
||||||
|
# gemappt. Weitere Länder bei Bedarf einfach ergänzen.
|
||||||
|
|
||||||
|
- name: Ziel-Locale aus Land ableiten
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
tuxflotte_land_locale: >-
|
||||||
|
{{
|
||||||
|
{
|
||||||
|
'DE': 'de_DE.UTF-8',
|
||||||
|
'AT': 'de_AT.UTF-8',
|
||||||
|
'CH': 'de_CH.UTF-8',
|
||||||
|
'US': 'en_US.UTF-8',
|
||||||
|
'GB': 'en_GB.UTF-8'
|
||||||
|
}[tuxflotte_optionen.land | default('DE')] | default('de_DE.UTF-8')
|
||||||
|
}}
|
||||||
|
|
||||||
|
- name: Locale generieren
|
||||||
|
community.general.locale_gen:
|
||||||
|
name: "{{ tuxflotte_land_locale }}"
|
||||||
|
state: present
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Locale als Systemstandard setzen
|
||||||
|
ansible.builtin.command: update-locale LANG={{ tuxflotte_land_locale }}
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the laender role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/laender.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}: {{ tuxflotte_land_locale }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Auf Standard-Locale (de_DE.UTF-8) zurücksetzen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.command: update-locale LANG=de_DE.UTF-8
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: laender-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/laender.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# libavcodec-extra buendelt die ueblichen proprietaeren/patentbehafteten
|
||||||
|
# Multimedia-Codecs (mp3 etc.) - regulaeres Debian/Ubuntu-Paket, apt-cache
|
||||||
|
# verifiziert (10.09.2026).
|
||||||
|
|
||||||
|
- name: Multimedia-Codecs installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: libavcodec-extra
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the multimedia-codecs role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/multimedia-codecs.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Multimedia-Codecs entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: libavcodec-extra
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: multimedia-codecs-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/multimedia-codecs.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# unattended-upgrades: reines Installieren reicht nicht, das Paket muss
|
||||||
|
# zusaetzlich per /etc/apt/apt.conf.d/20auto-upgrades aktiviert werden
|
||||||
|
# (Debian-Standardmechanismus, dieselbe Datei wie "dpkg-reconfigure
|
||||||
|
# unattended-upgrades" erzeugen wuerde). Nur Security-relevante Updates,
|
||||||
|
# keine vollen Dist-Upgrades - /etc/apt/apt.conf.d/50unattended-upgrades
|
||||||
|
# bringt die Standard-Origin-Liste (*-security) bereits als Default mit,
|
||||||
|
# unveraendert gelassen.
|
||||||
|
|
||||||
|
- name: unattended-upgrades installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: unattended-upgrades
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Automatische Sicherheitsupdates aktivieren
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /etc/apt/apt.conf.d/20auto-upgrades
|
||||||
|
content: |
|
||||||
|
APT::Periodic::Update-Package-Lists "1";
|
||||||
|
APT::Periodic::Unattended-Upgrade "1";
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: unattended-upgrades-Dienst aktiv halten
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: unattended-upgrades
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the security-updates role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/security-updates.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Automatische Sicherheitsupdates deaktivieren (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/apt/apt.conf.d/20auto-upgrades
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
# Live beim Testen gefunden (10.09.2026): Config-Datei-Entfernung allein
|
||||||
|
# liess das Paket installiert stehen - inkonsistent zum Rest des Katalogs.
|
||||||
|
- name: unattended-upgrades entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: unattended-upgrades
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: security-updates-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/security-updates.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
|
tuxflotte_optionen:
|
||||||
|
layout: de
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# Systemweites Standard-Tastaturlayout (Konsole + neue Login-Sitzungen) -
|
||||||
|
# reine Konfigurationsdatei, kein Paket noetig (console-setup/keyboard-
|
||||||
|
# configuration sind bereits Teil jedes Debian-Familie-Basissystems).
|
||||||
|
# tuxflotte_optionen.layout: "de" oder "us" (Default "de", siehe defaults/
|
||||||
|
# main.yml) - opake Option analog zum Brave-Standardbrowser-Muster.
|
||||||
|
|
||||||
|
- name: XKBLAYOUT in /etc/default/keyboard setzen
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/default/keyboard
|
||||||
|
regexp: '^XKBLAYOUT='
|
||||||
|
line: 'XKBLAYOUT="{{ tuxflotte_optionen.layout | default("de") }}"'
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
register: tuxflotte_keyboard_changed
|
||||||
|
|
||||||
|
- name: Layout-Änderung anwenden
|
||||||
|
ansible.builtin.command: dpkg-reconfigure -f noninteractive keyboard-configuration
|
||||||
|
when: tuxflotte_state == "present" and tuxflotte_keyboard_changed.changed
|
||||||
|
|
||||||
|
- name: Record that the tastaturlayout role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/tastaturlayout.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}: {{ tuxflotte_optionen.layout | default('de') }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
# "Abwählen" bedeutet hier: zurück auf den Tuxflotte-Standard (de), nicht
|
||||||
|
# ein undefiniertes Layout - anders als bei installierbaren Apps gibt es
|
||||||
|
# hier kein sinnvolles "gar kein Layout".
|
||||||
|
- name: Auf Standard-Layout (de) zurücksetzen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/default/keyboard
|
||||||
|
regexp: '^XKBLAYOUT='
|
||||||
|
line: 'XKBLAYOUT="de"'
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
register: tuxflotte_keyboard_reset
|
||||||
|
|
||||||
|
- name: Standard-Layout anwenden (Auftrag abgewählt)
|
||||||
|
ansible.builtin.command: dpkg-reconfigure -f noninteractive keyboard-configuration
|
||||||
|
when: tuxflotte_state == "absent" and tuxflotte_keyboard_reset.changed
|
||||||
|
|
||||||
|
- name: tastaturlayout-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/tastaturlayout.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# ClamAV: clamav-daemon bringt den On-Access-faehigen Hintergrunddienst mit,
|
||||||
|
# freshclam aktualisiert die Signaturen. Regulaere Debian/Ubuntu-Pakete,
|
||||||
|
# apt-cache verifiziert (10.09.2026). Live beim Testen gefunden (10.09.2026):
|
||||||
|
# clamav-daemon.service hat eine echte systemd-ConditionPathExistsGlob auf
|
||||||
|
# die Signatur-Datenbank (/var/lib/clamav/daily.*) - startet also bewusst
|
||||||
|
# NICHT sofort nach der Installation, sondern erst, sobald freshclam die
|
||||||
|
# erste Datenbank heruntergeladen hat (kann je nach Netz ein paar Minuten
|
||||||
|
# dauern). Kein Fehler, sondern korrektes ClamAV-Verhalten - "state:
|
||||||
|
# started" unten ist deshalb ein bewusst folgenloser Versuch, kein
|
||||||
|
# Fehlschlag, falls die DB noch fehlt. clamav-freshclam war im Test
|
||||||
|
# standardmaessig NICHT aktiviert (nur einmalig durchs Postinstall
|
||||||
|
# gestartet) - "enabled: true" stellt sicher, dass Signatur-Updates auch
|
||||||
|
# nach einem Reboot automatisch weiterlaufen.
|
||||||
|
|
||||||
|
- name: ClamAV installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- clamav
|
||||||
|
- clamav-daemon
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: freshclam-Signatur-Updater dauerhaft aktivieren
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: clamav-freshclam
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: ClamAV-Dienst aktiv halten (sobald Signaturdatenbank vorhanden ist)
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: clamav-daemon
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Record that the virenscanner role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/virenscanner.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: ClamAV entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name:
|
||||||
|
- clamav
|
||||||
|
- clamav-daemon
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: virenscanner-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/virenscanner.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# Echter Fund beim Live-Test auf golden-linux-mint (10.09.2026): der
|
||||||
|
# Paketname ist NICHT distributionsunabhängig, anders als bei den meisten
|
||||||
|
# anderen Merkmalen dieser Batch - Debian nennt das Metapaket
|
||||||
|
# "firmware-linux-nonfree", Ubuntu/Mint dagegen "linux-firmware". Beide
|
||||||
|
# real per apt-cache/apt-cache-search auf ihrer jeweiligen Plattform
|
||||||
|
# verifiziert. Setzt voraus, dass die Golden-Images die passende
|
||||||
|
# apt-Komponente (non-free-firmware bei Debian) aktiviert haben - auf
|
||||||
|
# allen drei Referenz-VMs bereits der Fall.
|
||||||
|
|
||||||
|
- name: Paketname je Distribution bestimmen
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
tuxflotte_firmware_paket: "{{ 'linux-firmware' if ansible_facts['distribution'] in ['Ubuntu', 'Linux Mint'] else 'firmware-linux-nonfree' }}"
|
||||||
|
|
||||||
|
- name: Proprietäre WLAN-/Netzwerk-Firmware installieren
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: "{{ tuxflotte_firmware_paket }}"
|
||||||
|
state: present
|
||||||
|
update_cache: true
|
||||||
|
cache_valid_time: 3600
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Record that the wlan-firmware role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/wlan-firmware.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}: {{ tuxflotte_firmware_paket }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Proprietäre WLAN-/Netzwerk-Firmware entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: "{{ tuxflotte_firmware_paket }}"
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: wlan-firmware-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/wlan-firmware.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
tuxflotte_state: present
|
||||||
|
tuxflotte_optionen:
|
||||||
|
ntp_server: pool.ntp.org
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
- name: Ensure marker directory exists
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied
|
||||||
|
state: directory
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
# systemd-timesyncd ist auf allen drei Ziel-Backends bereits Teil des
|
||||||
|
# Basissystems (kein zusätzliches Paket nötig) - reine Konfiguration.
|
||||||
|
# tuxflotte_optionen.ntp_server erlaubt einen kundeneigenen Zeitserver
|
||||||
|
# (z.B. eigener AD-Zeitserver), Default ist der öffentliche NTP-Pool.
|
||||||
|
|
||||||
|
- name: NTP-Server in /etc/systemd/timesyncd.conf setzen
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/systemd/timesyncd.conf
|
||||||
|
regexp: '^#?NTP='
|
||||||
|
line: 'NTP={{ tuxflotte_optionen.ntp_server | default("pool.ntp.org") }}'
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
register: tuxflotte_ntp_changed
|
||||||
|
|
||||||
|
- name: systemd-timesyncd neu starten
|
||||||
|
ansible.builtin.systemd:
|
||||||
|
name: systemd-timesyncd
|
||||||
|
state: restarted
|
||||||
|
enabled: true
|
||||||
|
when: tuxflotte_state == "present" and tuxflotte_ntp_changed.changed
|
||||||
|
|
||||||
|
- name: Record that the zeitserver role ran
|
||||||
|
ansible.builtin.copy:
|
||||||
|
dest: /run/tuxflotte/agent/applied/zeitserver.marker
|
||||||
|
content: "{{ ansible_date_time.iso8601 }}: {{ tuxflotte_optionen.ntp_server | default('pool.ntp.org') }}\n"
|
||||||
|
mode: "0644"
|
||||||
|
when: tuxflotte_state == "present"
|
||||||
|
|
||||||
|
- name: Auf öffentlichen NTP-Pool zurücksetzen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: /etc/systemd/timesyncd.conf
|
||||||
|
regexp: '^#?NTP='
|
||||||
|
line: 'NTP=pool.ntp.org'
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
|
|
||||||
|
- name: zeitserver-Marker entfernen (Auftrag abgewählt)
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /run/tuxflotte/agent/applied/zeitserver.marker
|
||||||
|
state: absent
|
||||||
|
when: tuxflotte_state == "absent"
|
||||||
@@ -375,3 +375,93 @@
|
|||||||
vars:
|
vars:
|
||||||
tuxflotte_webapps: "{{ tuxflotte_webapps }}"
|
tuxflotte_webapps: "{{ tuxflotte_webapps }}"
|
||||||
tags: webapp-shortcuts
|
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
|
||||||
Reference in new issue
Block a user