From 28e6c067a186184960d0dc251674927e2ab2e7d0 Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Tue, 4 Aug 2026 09:34:05 +0200 Subject: [PATCH] feat: add present/absent branching for Auftragskatalog roles Adds a tuxflotte_state variable, threaded from a new tuxflotte_auftrag_states dict in site.yml (role name -> present/absent, populated by the agent from the checkin response's "auftraege" list, see ADR-0010) down into each role via include_role vars. Roles not present in that dict default to "present" via .get(), so today's purely workspace-composed, additive-only behavior is unchanged. Retrofits all three existing placeholder roles with the present/absent branch as the reference implementation of the convention, and documents it in the README for future catalog-eligible roles. This is what makes deselecting an Auftrag actually revert something instead of just stopping future re-application. Co-Authored-By: Claude Sonnet 5 --- README.md | 28 +++++++++++++++++++++-- roles/brave-fedora/defaults/main.yml | 1 + roles/brave-fedora/tasks/main.yml | 7 ++++++ roles/guest-session/defaults/main.yml | 1 + roles/guest-session/tasks/main.yml | 7 ++++++ roles/onlyoffice-fedora/defaults/main.yml | 1 + roles/onlyoffice-fedora/tasks/main.yml | 7 ++++++ site.yml | 12 ++++++++++ 8 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 roles/brave-fedora/defaults/main.yml create mode 100644 roles/guest-session/defaults/main.yml create mode 100644 roles/onlyoffice-fedora/defaults/main.yml diff --git a/README.md b/README.md index a675c5b..ead0d36 100644 --- a/README.md +++ b/README.md @@ -14,8 +14,32 @@ ansible-pull -U --tags ,,... -i localhost, site.yml Alle Rollen sind Platzhalter — sie hinterlegen nur eine Marker-Datei unter `/run/tuxflotte/agent/applied/.marker`, um die End-to-End-Pipeline (Server → Agent → ansible-pull → Rolle) nachzuweisen. Echte Rolleninhalte folgen später. +## present/absent (Auftragskatalog, ADR-0010) + +Merkmale, die für die geräteweise Ad-hoc-Zuweisung über den Auftragskatalog freigegeben sind (`merkmale.im_auftragskatalog = true`), können nicht nur zugewiesen, sondern auch wieder abgewählt werden — und das muss real etwas zurückbauen, nicht nur zukünftige Anwendung verhindern. + +Dafür reicht der Agent bei jedem `ansible-pull`-Lauf eine Variable `tuxflotte_auftrag_states` durch (Rollenname → `"present"`/`"absent"`, aus der Check-in-Antwort `auftraege`), die `site.yml` pro Rolle als `tuxflotte_state` an die jeweilige Rolle weiterreicht. Rollen, die dort nicht auftauchen (zum Beispiel weil sie nur workspace-komponiert sind, nicht katalogfähig), laufen unverändert additiv über `--tags`, ohne `absent`-Zustand — siehe `tuxflotte_auftrag_states.get(, 'present')` in `site.yml`. + +Jede Rolle, die katalogfähig werden soll, muss deshalb ihre Tasks auf `tuxflotte_state` verzweigen: + +```yaml +- name: + ... + when: tuxflotte_state == "present" + +- name: + ... + when: tuxflotte_state == "absent" +``` + +`tuxflotte_state` hat in `roles//defaults/main.yml` den Default `present`, damit die Rolle auch bei direkter Verwendung ohne die `site.yml`-Verdrahtung nicht auf eine undefinierte Variable trifft. + +Rollen, die nie katalogfähig werden (rein workspace-komponierte Merkmale), brauchen keinen `absent`-Zweig — das ist bewusst kein Zwang für alle Rollen, nur für die, die tatsächlich im Auftragskatalog landen. + ## Neue Rolle hinzufügen 1. `roles//tasks/main.yml` anlegen -2. Eintrag in `site.yml` mit `tags: ` ergänzen -3. Entsprechenden `ansible_role`-Wert in der `blueprints`-Tabelle referenzieren +2. `roles//defaults/main.yml` mit `tuxflotte_state: present` anlegen +3. Eintrag in `site.yml` mit `tags: ` und `vars: tuxflotte_state: "{{ tuxflotte_auftrag_states.get('', 'present') }}"` ergänzen +4. Entsprechenden `ansible_role`-Wert in der `blueprints`-Tabelle referenzieren +5. Nur falls die Rolle katalogfähig werden soll (`im_auftragskatalog = true`): Tasks wie oben auf `tuxflotte_state` verzweigen, sonst reicht der additive Pfad ohne `when` diff --git a/roles/brave-fedora/defaults/main.yml b/roles/brave-fedora/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/brave-fedora/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/brave-fedora/tasks/main.yml b/roles/brave-fedora/tasks/main.yml index cb31b49..a3361bd 100644 --- a/roles/brave-fedora/tasks/main.yml +++ b/roles/brave-fedora/tasks/main.yml @@ -9,3 +9,10 @@ dest: /run/tuxflotte/agent/applied/brave-fedora.marker content: "{{ ansible_date_time.iso8601 }}\n" mode: "0644" + when: tuxflotte_state == "present" + +- name: Remove brave-fedora marker (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/brave-fedora.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/roles/guest-session/defaults/main.yml b/roles/guest-session/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/guest-session/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/guest-session/tasks/main.yml b/roles/guest-session/tasks/main.yml index 42a52df..1d96006 100644 --- a/roles/guest-session/tasks/main.yml +++ b/roles/guest-session/tasks/main.yml @@ -9,3 +9,10 @@ dest: /run/tuxflotte/agent/applied/guest-session.marker content: "{{ ansible_date_time.iso8601 }}\n" mode: "0644" + when: tuxflotte_state == "present" + +- 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" diff --git a/roles/onlyoffice-fedora/defaults/main.yml b/roles/onlyoffice-fedora/defaults/main.yml new file mode 100644 index 0000000..94c225a --- /dev/null +++ b/roles/onlyoffice-fedora/defaults/main.yml @@ -0,0 +1 @@ +tuxflotte_state: present diff --git a/roles/onlyoffice-fedora/tasks/main.yml b/roles/onlyoffice-fedora/tasks/main.yml index 4425d38..69b829a 100644 --- a/roles/onlyoffice-fedora/tasks/main.yml +++ b/roles/onlyoffice-fedora/tasks/main.yml @@ -9,3 +9,10 @@ dest: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker content: "{{ ansible_date_time.iso8601 }}\n" mode: "0644" + when: tuxflotte_state == "present" + +- name: Remove onlyoffice-fedora marker (Auftrag abgewählt) + ansible.builtin.file: + path: /run/tuxflotte/agent/applied/onlyoffice-fedora.marker + state: absent + when: tuxflotte_state == "absent" diff --git a/site.yml b/site.yml index 58b800f..c6c676d 100644 --- a/site.yml +++ b/site.yml @@ -1,21 +1,33 @@ - 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: {} tasks: - include_role: name: guest-session apply: tags: guest-session + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('guest-session', 'present') }}" tags: guest-session - include_role: name: brave-fedora apply: tags: brave-fedora + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('brave-fedora', 'present') }}" tags: brave-fedora - include_role: name: onlyoffice-fedora apply: tags: onlyoffice-fedora + vars: + tuxflotte_state: "{{ tuxflotte_auftrag_states.get('onlyoffice-fedora', 'present') }}" tags: onlyoffice-fedora