Files
ssh-jumphost/ansible/roles/guacd/tasks/main.yml
2026-08-20 00:31:20 +02:00

239 lines
9.4 KiB
YAML

---
# guacd + FreeRDP als reine Protokoll-Engine fuer RDP (Konzept 3/4.3).
# Laeuft ausschliesslich lokal gebunden, kein Netzwerkzugriff von aussen.
#
# Installationsweg haengt vom Ziel-OS ab:
#
# - Ubuntu (22.04/24.04): hat ein fertiges apt-Paket ("guacd",
# "libguac-client-rdp0", ueber die "universe"-Komponente). Zwar mit
# veralteter Version (1.3.0), aber offiziell von Ubuntu gepflegt und
# bekommt automatisch Sicherheitsupdates ueber unattended-upgrades (da
# dynamisch gegen libfreerdp2 gelinkt). Daher hier bevorzugt.
#
# - Debian: hat KEIN guacd-apt-Paket (weder bookworm noch trixie -- nur
# Ubuntu paketiert es ueber "universe"). Daher wird guacd hier gemaess der
# offiziellen Apache-Guacamole-Doku ("Installing Guacamole natively") aus
# dem Quellcode gebaut. Nur das RDP-Plugin wird aktiviert
# (FreeRDP-Dev-Header vorhanden, kein VNC/Telnet), passend zum reinen
# RDP-Einsatzzweck dieses Jumphosts.
#
# FreeRDP-Paketname und Build-Quelle haengen dabei von der Debian-Version ab:
#
# - Debian 12 (bookworm): liefert nur FreeRDP2 (freerdp2-dev). Dafuer wird
# der offizielle guacamole-server-1.5.5-Release-Tarball gebaut (stabil,
# Checksum-verifiziert).
#
# - Debian 13 (trixie): liefert nur FreeRDP3 (freerdp3-dev), und zwar
# bereits Version 3.15 -- NEUER als das, wogegen der letzte offizielle
# guacamole-server-Release (1.6.0) geschrieben wurde. Sowohl der
# 1.6.0-Tarball als auch der aktuelle "main"-Branch (git, Stand: Aug 2026)
# bauen NICHT gegen trixies FreeRDP3 (u.a. entfernter "->input"-Member
# auf rdpFreerdp, s. https://issues.apache.org/jira/browse/GUACAMOLE-2146
# und diverse Debian-13-Install-Guides, die genau das bestaetigen).
# Es gibt noch KEIN Release oder git-main-Stand mit funktionierender
# FreeRDP-3.15-Unterstuetzung. Der git-main-Pfad bleibt hier dennoch als
# Option bestehen (fuer den Fall, dass ein zukuenftiger Commit das
# behebt), ist aber AUSDRUECKLICH KEIN von Apache Guacamole empfohlener
# Weg (Doku: "please not a non-release version from git") und aktuell
# NICHT funktionsfaehig getestet. Fuer produktive Debian-13-Hosts also
# bis auf Weiteres eher Ubuntu oder Debian 12 als Zielsystem waehlen.
# Sobald ein Fix verfuegbar ist: guacd_git_ref auf den entsprechenden
# Commit/Branch setzen, oder bei einem echten Release guacd_version auf
# den Tag setzen (erzwingt den stabilen Release-Tarball-Pfad).
- name: Installationsweg (apt vs. Quellcode) und ggf. FreeRDP-Paket/Version anhand der Distribution bestimmen
ansible.builtin.set_fact:
_guacd_install_mode: "{{ 'apt' if ansible_distribution == 'Ubuntu' else 'source' }}"
_guacd_build_needed: false
_guacd_src_dir: ""
_guacd_freerdp_pkg: >-
{{ guacd_freerdp_dev_package
if (guacd_freerdp_dev_package | default('', true) | length > 0)
else ('freerdp3-dev'
if (ansible_distribution == 'Debian' and ansible_distribution_major_version | int >= 13)
else 'freerdp2-dev') }}
_guacd_build_mode: >-
{{ 'release'
if (guacd_version | default('', true) | length > 0)
else ('git'
if (ansible_distribution == 'Debian' and ansible_distribution_major_version | int >= 13)
else 'release') }}
_guacd_version: "{{ guacd_version if (guacd_version | default('', true) | length > 0) else '1.5.5' }}"
_guacd_git_ref: "{{ guacd_git_ref | default('main') }}"
# --- apt-Pfad (Ubuntu) ------------------------------------------------------
- name: 'guacd und FreeRDP-Plugin per apt installieren (Ubuntu: guacd liegt in "universe")'
ansible.builtin.apt:
name:
- guacd
- libguac-client-rdp0
state: present
update_cache: true
when: _guacd_install_mode == 'apt'
# --- Quellcode-Pfad (Debian) -------------------------------------------------
- name: Build-Abhaengigkeiten fuer guacd installieren
ansible.builtin.apt:
name:
- build-essential
- libcairo2-dev
- libjpeg62-turbo-dev
- libpng-dev
- libtool-bin
- uuid-dev
- libpango1.0-dev
- libssl-dev
- "{{ _guacd_freerdp_pkg }}"
- pkg-config
- wget
- ca-certificates
- git
- autoconf
- automake
- libtool
state: present
update_cache: true
when: _guacd_install_mode == 'source'
- name: Vorhandene guacd-Quellcode-Installation pruefen
ansible.builtin.stat:
path: /usr/local/sbin/guacd
register: _guacd_bin
when: _guacd_install_mode == 'source'
- name: Installierte guacd-Version ermitteln (Release-Pfad)
ansible.builtin.command: /usr/local/sbin/guacd -v
register: _guacd_installed_version
changed_when: false
when: _guacd_install_mode == 'source' and _guacd_bin.stat.exists and _guacd_build_mode == 'release'
- name: guacamole-server Quellcode-Tarball herunterladen
ansible.builtin.get_url:
url: "https://archive.apache.org/dist/guacamole/{{ _guacd_version }}/source/guacamole-server-{{ _guacd_version }}.tar.gz"
dest: "/usr/local/src/guacamole-server-{{ _guacd_version }}.tar.gz"
checksum: "sha256:https://archive.apache.org/dist/guacamole/{{ _guacd_version }}/source/guacamole-server-{{ _guacd_version }}.tar.gz.sha256"
mode: "0644"
when: >-
_guacd_install_mode == 'source' and _guacd_build_mode == 'release' and
((not _guacd_bin.stat.exists) or (_guacd_version not in (_guacd_installed_version.stdout | default(''))))
- name: guacamole-server Tarball entpacken
ansible.builtin.unarchive:
src: "/usr/local/src/guacamole-server-{{ _guacd_version }}.tar.gz"
dest: /usr/local/src
remote_src: true
creates: "/usr/local/src/guacamole-server-{{ _guacd_version }}/configure"
when: >-
_guacd_install_mode == 'source' and _guacd_build_mode == 'release' and
((not _guacd_bin.stat.exists) or (_guacd_version not in (_guacd_installed_version.stdout | default(''))))
- name: Feststellen, ob (Neu-)Build noetig ist (Release-Pfad)
ansible.builtin.set_fact:
_guacd_build_needed: "{{ (not _guacd_bin.stat.exists) or (_guacd_version not in (_guacd_installed_version.stdout | default(''))) }}"
_guacd_src_dir: "/usr/local/src/guacamole-server-{{ _guacd_version }}"
when: _guacd_install_mode == 'source' and _guacd_build_mode == 'release'
- name: guacamole-server-Quellcode (git {{ _guacd_git_ref }}) holen/aktualisieren
ansible.builtin.git:
repo: https://github.com/apache/guacamole-server.git
dest: /usr/local/src/guacamole-server-git
version: "{{ _guacd_git_ref }}"
force: true
register: _guacd_git
when: _guacd_install_mode == 'source' and _guacd_build_mode == 'git'
- name: Feststellen, ob (Neu-)Build noetig ist (git-Pfad)
ansible.builtin.set_fact:
_guacd_build_needed: "{{ (not _guacd_bin.stat.exists) or _guacd_git.changed }}"
_guacd_src_dir: /usr/local/src/guacamole-server-git
when: _guacd_install_mode == 'source' and _guacd_build_mode == 'git'
- name: Build-System aus configure.ac generieren (autoreconf, nur git-Pfad)
ansible.builtin.command:
cmd: autoreconf -fi
chdir: "{{ _guacd_src_dir }}"
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)
ansible.builtin.command:
cmd: >-
./configure --with-systemd-dir=/etc/systemd/system
--disable-guacenc --disable-guaclog
chdir: "{{ _guacd_src_dir }}"
when: _guacd_install_mode == 'source' and _guacd_build_needed
- name: guacamole-server kompilieren
ansible.builtin.command:
cmd: "make -j{{ ansible_processor_vcpus | default(2) }}"
chdir: "{{ _guacd_src_dir }}"
when: _guacd_install_mode == 'source' and _guacd_build_needed
changed_when: true
- name: guacamole-server installieren (make install)
ansible.builtin.command:
cmd: make install
chdir: "{{ _guacd_src_dir }}"
when: _guacd_install_mode == 'source' and _guacd_build_needed
notify:
- reload systemd
- restart guacd
- name: Shared-Library-Cache aktualisieren (ldconfig)
ansible.builtin.command: ldconfig
when: _guacd_install_mode == 'source' and _guacd_build_needed
changed_when: false
# --- Gemeinsame Konfiguration (beide Pfade) ---------------------------------
- name: Dedizierten guacd-User sicherstellen (apt-Paket legt ihn i.d.R. bereits an)
ansible.builtin.user:
name: guacd
system: true
shell: /usr/sbin/nologin
create_home: false
- name: guacd nur an localhost binden
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^bind_host'
line: "bind_host = 127.0.0.1"
create: true
notify: restart guacd
- name: guacd-Port setzen
ansible.builtin.lineinfile:
path: /etc/guacamole/guacd.conf
regexp: '^bind_port'
line: "bind_port = {{ guacd_port }}"
create: true
notify: restart guacd
- name: RDP-Laufwerksumleitungs-Verzeichnisse anlegen (Filetransfer, Konzept 4.3)
ansible.builtin.file:
path: "/var/lib/jumphost/rdp-drives"
state: directory
owner: guacd
group: guacd
mode: "0750"
- name: Override-Verzeichnis fuer guacd-Unit anlegen
ansible.builtin.file:
path: /etc/systemd/system/guacd.service.d
state: directory
owner: root
group: root
mode: "0755"
- name: Gehaertete systemd-Unit fuer guacd ausrollen (Override)
ansible.builtin.template:
src: guacd.service.j2
dest: /etc/systemd/system/guacd.service.d/override.conf
owner: root
group: root
mode: "0644"
notify:
- reload systemd
- restart guacd