umbau 1.0
This commit is contained in:
@ -157,9 +157,17 @@
|
||||
when: _guacd_install_mode == 'source' and _guacd_build_mode == 'git' and _guacd_build_needed
|
||||
|
||||
- name: guacamole-server konfigurieren (nur RDP-Plugin, kein VNC/Telnet/guacenc)
|
||||
# --sysconfdir=/etc ist Pflicht (Befund 3, Umsetzungsauftrag_Sonnet5.md
|
||||
# Teil A.2): ohne diesen Schalter sucht guacd sein Konfigverzeichnis unter
|
||||
# /usr/local/etc/guacamole, waehrend die Tasks weiter unten unveraendert
|
||||
# nach /etc/guacamole schreiben. Solange guacd_port/bind_host auf den
|
||||
# (unwirksamen) Defaults stehen faellt das nicht auf; sobald einer davon
|
||||
# abweicht, lauscht guacd auf dem falschen Port/Host und die App bekommt
|
||||
# "[Errno 111] Connection refused".
|
||||
ansible.builtin.command:
|
||||
cmd: >-
|
||||
./configure --with-systemd-dir=/etc/systemd/system
|
||||
--sysconfdir=/etc
|
||||
--disable-guacenc --disable-guaclog
|
||||
chdir: "{{ _guacd_src_dir }}"
|
||||
when: _guacd_install_mode == 'source' and _guacd_build_needed
|
||||
@ -185,14 +193,67 @@
|
||||
when: _guacd_install_mode == 'source' and _guacd_build_needed
|
||||
changed_when: false
|
||||
|
||||
- name: Pruefen, dass das RDP-Plugin tatsaechlich gebaut und installiert wurde
|
||||
# Der Build ueberspringt das RDP-Plugin STILLSCHWEIGEND, wenn die
|
||||
# FreeRDP-Header (_guacd_freerdp_pkg) beim configure-Lauf fehlten oder
|
||||
# nicht gefunden wurden -- "make"/"make install" laufen trotzdem
|
||||
# fehlerfrei durch. Ohne diese Pruefung faellt das erst zur Laufzeit auf,
|
||||
# als "Support for protocol "rdp" is not installed" von guacd, mitten in
|
||||
# einem Verbindungsversuch (Umsetzungsauftrag_Sonnet5.md Teil A.2, "Zu
|
||||
# tun"-Liste). Beide moeglichen Installationspfade des Plugins abdecken:
|
||||
# /usr/local/lib direkt (aeltere guacamole-server-Versionen) und
|
||||
# /usr/local/lib/guacamole (aktuelle Versionen, eigenes Plugin-Verzeichnis).
|
||||
ansible.builtin.find:
|
||||
paths:
|
||||
- /usr/local/lib
|
||||
- /usr/local/lib/guacamole
|
||||
patterns: "libguac-client-rdp.so*"
|
||||
recurse: false
|
||||
register: _guacd_rdp_plugin
|
||||
when: _guacd_install_mode == 'source'
|
||||
|
||||
- name: Abbrechen, wenn das RDP-Plugin fehlt
|
||||
ansible.builtin.fail:
|
||||
msg: >-
|
||||
guacd wurde gebaut, aber libguac-client-rdp.so* wurde weder unter
|
||||
/usr/local/lib noch /usr/local/lib/guacamole gefunden. Vermutliche
|
||||
Ursache: die FreeRDP-Entwicklungspakete ({{ _guacd_freerdp_pkg }})
|
||||
waren beim './configure'-Lauf nicht vollstaendig installiert, das
|
||||
RDP-Plugin wurde daraufhin stillschweigend uebersprungen. Pruefen:
|
||||
'apt policy {{ _guacd_freerdp_pkg }}' auf dem Zielsystem, danach den
|
||||
Build-Ordner ({{ _guacd_src_dir }}) loeschen und die Rolle erneut
|
||||
ausfuehren, damit configure/make sauber neu laufen.
|
||||
when: _guacd_install_mode == 'source' and (_guacd_rdp_plugin.matched | default(0)) == 0
|
||||
|
||||
# --- Gemeinsame Konfiguration (beide Pfade) ---------------------------------
|
||||
|
||||
- name: Dedizierten guacd-User sicherstellen (apt-Paket legt ihn i.d.R. bereits an)
|
||||
# Befund B6: als Zweitgruppe "{{ jumphost_app_group }}" (append, nicht
|
||||
# ersetzen) bekommt guacd das Traversal-Bit auf {{ jumphost_data_dir }}
|
||||
# (siehe Rolle sqlite_init) und kann damit ueberhaupt erst bis zu
|
||||
# rdp-drives/ vordringen. Ohne diese Zeile schlaegt jede RDP-Sitzung mit
|
||||
# aktivierter Laufwerksumleitung mit EACCES fehl.
|
||||
ansible.builtin.user:
|
||||
name: guacd
|
||||
system: true
|
||||
shell: /usr/sbin/nologin
|
||||
create_home: false
|
||||
groups: "{{ jumphost_app_group }}"
|
||||
append: true
|
||||
notify: restart guacd # neue Gruppenmitgliedschaft wirkt erst nach einem Neustart des Prozesses
|
||||
|
||||
- name: Konfigurationsverzeichnis /etc/guacamole anlegen
|
||||
# Befund 4 (Umsetzungsauftrag_Sonnet5.md Teil A.2): lineinfile mit
|
||||
# create:true legt nur die FEHLENDE DATEI an, nicht das Verzeichnis --
|
||||
# ohne diesen Task bricht die Rolle bei den beiden folgenden lineinfile-
|
||||
# Tasks ab, wenn /etc/guacamole noch nicht existiert (frischer Host, oder
|
||||
# apt-Pfad ohne vorherigen Paketaufruf).
|
||||
ansible.builtin.file:
|
||||
path: /etc/guacamole
|
||||
state: directory
|
||||
owner: root
|
||||
group: root
|
||||
mode: "0755"
|
||||
|
||||
- name: guacd nur an localhost binden
|
||||
ansible.builtin.lineinfile:
|
||||
@ -236,3 +297,67 @@
|
||||
notify:
|
||||
- reload systemd
|
||||
- restart guacd
|
||||
|
||||
# --- Start-/Erreichbarkeitspruefung (Befunde 1, 2, 7 aus Umsetzungsauftrag_Sonnet5.md Teil A.2) ---
|
||||
|
||||
- name: Anstehende Handler (z.B. "restart guacd" nach Config-/Unit-Aenderung) sofort anwenden
|
||||
# Befund 7: Handler werden von Ansible standardmaessig erst am ENDE DES
|
||||
# GESAMTEN PLAYS geflusht, nicht am Ende dieser Rolle. Ohne dieses meta
|
||||
# wuerde "restart guacd" erst NACH dem ersten Start von jumphost_app
|
||||
# laufen (site.yml ordnet die Rollen zwar guacd -> jumphost_app, aber der
|
||||
# Handler-Flush ist rollenuebergreifend ans Play-Ende gebunden) -- der
|
||||
# allererste App-Start faende dann einen noch alten/toten guacd-Prozess vor.
|
||||
ansible.builtin.meta: flush_handlers
|
||||
|
||||
- name: guacd aktivieren und starten (unabhaengig davon, ob gerade ein Handler ausgeloest wurde)
|
||||
# Befund 1: die Rolle hatte bislang KEINEN expliziten service-Task, nur
|
||||
# den Handler "restart guacd" (laeuft ausschliesslich bei einer
|
||||
# Aenderung). Ein zweiter Ansible-Lauf ohne Aenderung meldete bisher
|
||||
# ueberall "ok", auch wenn guacd zwischenzeitlich (Absturz, manuelles
|
||||
# "systemctl stop", OOM-Kill) tot war -- das ist nach dem Debian-12-Wechsel
|
||||
# die wahrscheinlichste verbleibende Ursache fuer
|
||||
# "[Errno 111] Connection refused" auf einem sonst funktionierenden Build.
|
||||
ansible.builtin.service:
|
||||
name: guacd
|
||||
state: started
|
||||
enabled: true
|
||||
|
||||
- name: Warten, bis guacd tatsaechlich auf dem konfigurierten Port lauscht
|
||||
# Befund 2: keine Startpruefung. Ohne wait_for bleibt ein fehlgeschlagener
|
||||
# Start unbemerkt, bis der erste Benutzer eine RDP-Sitzung versucht --
|
||||
# genau das Symptom aus dem gemeldeten Vorfall (Teil A.0).
|
||||
ansible.builtin.wait_for:
|
||||
host: 127.0.0.1
|
||||
port: "{{ guacd_port }}"
|
||||
timeout: 15
|
||||
state: started
|
||||
register: _guacd_port_check
|
||||
ignore_errors: true
|
||||
|
||||
- name: Abbrechen mit Klartext, wenn guacd nicht auf dem konfigurierten Port lauscht
|
||||
ansible.builtin.fail:
|
||||
msg: >-
|
||||
guacd lauscht nach dem Start NICHT auf 127.0.0.1:{{ guacd_port }}
|
||||
(Timeout nach 15s). Auf dem Zielsystem pruefen: 'systemctl status
|
||||
guacd', 'journalctl -u guacd -n 50', 'ss -ltnp | grep {{ guacd_port }}'.
|
||||
Haeufigste Ursachen laut Umsetzungsauftrag_Sonnet5.md Teil A.2: das
|
||||
systemd-Hardening-Drop-in (ProtectSystem=strict) blockiert ein von
|
||||
guacd benoetigtes Laufzeit-/Schreibverzeichnis, oder
|
||||
/etc/guacamole/guacd.conf wird wegen eines fehlenden
|
||||
--sysconfdir=/etc beim configure-Lauf gar nicht erst gelesen.
|
||||
when: _guacd_port_check is failed
|
||||
|
||||
- name: Smoke-Test - lauschenden Port gegen die App-Konfiguration abgleichen
|
||||
# Letzter Punkt aus der "Zu tun"-Liste (Teil A.2): der oben erfolgreich
|
||||
# geprüfte Port ist bereits exakt derselbe Wert wie guacd_port, aus dem
|
||||
# sowohl diese Rolle als auch app/config.py::settings.guacd_port (ueber
|
||||
# die Rolle jumphost_app) gespeist werden -- ein Auseinanderlaufen ist
|
||||
# durch die gemeinsame Variable strukturell ausgeschlossen. Trotzdem
|
||||
# explizit sichtbar machen, damit ein kuenftiger Review sofort sieht, WO
|
||||
# dieser Abgleich stattfindet, falls App- und guacd-Port je entkoppelt
|
||||
# werden sollten.
|
||||
ansible.builtin.debug:
|
||||
msg: >-
|
||||
guacd-Smoke-Test erfolgreich: guacd lauscht auf
|
||||
127.0.0.1:{{ guacd_port }}, identisch mit dem von der App erwarteten
|
||||
Port (Variable guacd_port, siehe app/config.py::settings.guacd_port).
|
||||
|
||||
Reference in New Issue
Block a user