Thomas Stallinger 8cd3f13dac fix: nopasswdlogin-PAM-Zeile nicht duplizieren (Debian-Familie)
lineinfile matchte bisher nur exakten Text - Debian/LightDM liefert eine
Zeile mit identischer Wirkung, aber anderer Formatierung mit, wurde also
nicht erkannt und stattdessen dupliziert. regexp behebt das für den
present-Task; der absent-Task bleibt bewusst beim exakten String-Match,
damit er nie die von der Distribution mitgelieferte Zeile entfernt.

Gefunden bei der E2E-Verifikation auf der QEMU-Test-VM.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 15:48:52 +02:00

98 lines
3.8 KiB
YAML

- name: Ensure marker directory exists
ansible.builtin.file:
path: /run/tuxflotte/agent/applied
state: directory
mode: "0755"
# PAM-Dateilayout unterscheidet sich zwischen RedHat- (GDM/authselect) und
# Debian-Familie (LightDM/common-*) - beide Backends (fedora, mint) nutzen
# denselben Rollennamen "guest-session" (siehe blueprints-Seed), die Rolle
# muss also auf beiden funktionieren.
- name: Determine PAM file locations for this distribution family
ansible.builtin.set_fact:
tuxflotte_guest_pam_auth_file: "{{ '/etc/pam.d/gdm-password' if ansible_facts['os_family'] == 'RedHat' else '/etc/pam.d/lightdm' }}"
tuxflotte_guest_pam_session_file: "{{ '/etc/pam.d/postlogin' if ansible_facts['os_family'] == 'RedHat' else '/etc/pam.d/common-session' }}"
- name: Ensure nopasswdlogin group exists (present)
ansible.builtin.group:
name: nopasswdlogin
state: present
when: tuxflotte_state == "present"
- name: Ensure gast user exists (present)
ansible.builtin.user:
name: gast
comment: "Tuxflotte Gastsitzung"
groups: nopasswdlogin
append: true
shell: /bin/bash
password_lock: true
when: tuxflotte_state == "present"
# Debian/LightDM bringt eine Zeile mit identischer Wirkung bereits
# standardmäßig mit, allerdings mit anderer Formatierung - regexp erkennt
# sie als bereits erfüllt (kein Duplikat). Auf Fedora/GDM existiert noch
# nichts Passendes, die Zeile wird frisch eingefügt.
- name: Allow passwordless login for nopasswdlogin group
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_auth_file }}"
regexp: '^auth\s+sufficient\s+pam_succeed_if\.so\s+user\s+ingroup\s+nopasswdlogin\s*$'
line: "auth sufficient pam_succeed_if.so user ingroup nopasswdlogin"
insertbefore: BOF
state: present
when: tuxflotte_state == "present"
- name: Ensure ephemeral tmpfs home for gast (pam_namespace polyinstantiation)
ansible.builtin.lineinfile:
path: /etc/security/namespace.conf
line: "/home/gast tmpfs tmpfs:mntopts=size=2G,mode=0700 root,gast"
regexp: '^/home/gast\s'
state: present
when: tuxflotte_state == "present"
- name: Enable pam_namespace for login sessions
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_session_file }}"
line: "session required pam_namespace.so"
state: present
when: tuxflotte_state == "present"
- name: Record that the guest-session role ran
ansible.builtin.copy:
dest: /run/tuxflotte/agent/applied/guest-session.marker
content: "{{ ansible_date_time.iso8601 }}\n"
mode: "0644"
when: tuxflotte_state == "present"
- name: Remove ephemeral tmpfs home entry for gast (Auftrag abgewählt)
ansible.builtin.lineinfile:
path: /etc/security/namespace.conf
regexp: '^/home/gast\s'
state: absent
when: tuxflotte_state == "absent"
# Entfernt die nopasswdlogin-Regel vollständig, nicht nur den gast-Account -
# betrifft auf Debian/LightDM auch den distributionseigenen Default-Eintrag.
# Bewusst in Kauf genommen: diese Rolle ist der einzige Verwalter der
# nopasswdlogin-Konvention in diesem Katalog, Wiederherstellung beim
# nächsten present-Lauf ist kostenlos.
- name: Remove passwordless login rule for nopasswdlogin group (Auftrag abgewählt)
ansible.builtin.lineinfile:
path: "{{ tuxflotte_guest_pam_auth_file }}"
line: "auth sufficient pam_succeed_if.so user ingroup nopasswdlogin"
state: absent
when: tuxflotte_state == "absent"
- name: Remove gast user and home (Auftrag abgewählt)
ansible.builtin.user:
name: gast
state: absent
remove: true
when: tuxflotte_state == "absent"
- name: Remove guest-session marker (Auftrag abgewählt)
ansible.builtin.file:
path: /run/tuxflotte/agent/applied/guest-session.marker
state: absent
when: tuxflotte_state == "absent"