From 597e9d52225919bd4bd58f23467c522d87ea8f34 Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Wed, 13 Aug 2025 20:26:40 +0200 Subject: [PATCH] Refactor async execution handling across LDAP and Nextcloud roles - Introduce global async configuration in group_vars/all/00_general.yml: - ASYNC_ENABLED (disabled in debug mode) - ASYNC_TIME (default 300s, omitted if async disabled) - ASYNC_POLL (0 for async fire-and-forget, 10 for sync mode) - Replace hardcoded async/poll values with global vars in: - svc-db-openldap (03_users.yml, 04_update.yml) - web-app-mig (02_build_data.yml) - web-app-nextcloud (03_admin.yml, 04_system_config.yml, 05_plugin.yml, 06_plugin_routines.yml, 07_plugin_enable_and_configure.yml) - Guard changed_when and failed_when conditions to only evaluate in synchronous mode to avoid accessing undefined rc/stdout/stderr in async runs https://chatgpt.com/share/689cd8cc-7fbc-800f-bd06-a667561573bf --- group_vars/all/00_general.yml | 5 +++++ roles/svc-db-openldap/tasks/03_users.yml | 8 ++++---- roles/svc-db-openldap/tasks/04_update.yml | 4 ++-- roles/web-app-mig/tasks/02_build_data.yml | 4 ++-- roles/web-app-nextcloud/tasks/03_admin.yml | 7 +++++-- roles/web-app-nextcloud/tasks/04_system_config.yml | 5 ++++- roles/web-app-nextcloud/tasks/05_plugin.yml | 6 +++--- roles/web-app-nextcloud/tasks/06_plugin_routines.yml | 2 ++ .../tasks/07_plugin_enable_and_configure.yml | 5 ++++- 9 files changed, 31 insertions(+), 15 deletions(-) diff --git a/group_vars/all/00_general.yml b/group_vars/all/00_general.yml index 4910b605..c324ebbd 100644 --- a/group_vars/all/00_general.yml +++ b/group_vars/all/00_general.yml @@ -64,6 +64,11 @@ LETSENCRYPT_LIVE_PATH: "{{ LETSENCRYPT_BASE_PATH }}live/" DOCKER_RESTART_POLICY: "unless-stopped" DOCKER_VARS_FILE: "{{ playbook_dir }}/roles/docker-compose/vars/docker-compose.yml" +# Asyn Confitguration +ASYNC_ENABLED: "{{ not MODE_DEBUG | bool}}" # Activate async, deactivated for debugging +ASYNC_TIME: "{{ 300 if ASYNC_ENABLED else omit }}" # Run for mnax 5min +ASYNC_POLL: "{{ 0 if ASYNC_ENABLED else 10 }}" # Don't wait for task + # default value if not set via CLI (-e) or in playbook vars allowed_applications: [] diff --git a/roles/svc-db-openldap/tasks/03_users.yml b/roles/svc-db-openldap/tasks/03_users.yml index de97d42b..1b4f178c 100644 --- a/roles/svc-db-openldap/tasks/03_users.yml +++ b/roles/svc-db-openldap/tasks/03_users.yml @@ -18,8 +18,8 @@ uidNumber: "{{ item.value.uid | int }}" gidNumber: "{{ item.value.gid | int }}" state: present # ↳ creates but never updates - async: 60 - poll: 0 + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" loop: "{{ users | dict2items }}" loop_control: label: "{{ item.key }}" @@ -37,8 +37,8 @@ objectClass: "{{ ldap.user.objects.structural }}" mail: "{{ item.value.email }}" state: exact - async: 60 - poll: 0 + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" loop: "{{ users | dict2items }}" loop_control: label: "{{ item.key }}" diff --git a/roles/svc-db-openldap/tasks/04_update.yml b/roles/svc-db-openldap/tasks/04_update.yml index 9423ffac..4cef1b5d 100644 --- a/roles/svc-db-openldap/tasks/04_update.yml +++ b/roles/svc-db-openldap/tasks/04_update.yml @@ -21,8 +21,8 @@ attributes: objectClass: "{{ missing_auxiliary }}" state: present - async: 60 - poll: 0 + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" loop: "{{ ldap_users_with_classes.results }}" loop_control: label: "{{ item.dn }}" diff --git a/roles/web-app-mig/tasks/02_build_data.yml b/roles/web-app-mig/tasks/02_build_data.yml index 48ceb101..400cbe02 100644 --- a/roles/web-app-mig/tasks/02_build_data.yml +++ b/roles/web-app-mig/tasks/02_build_data.yml @@ -3,8 +3,8 @@ set -euo pipefail infinito build tree --no-signal --alarm-timeout 0 -s {{ mig_roles_meta_volume }} infinito build roles_list --no-signal --alarm-timeout 0 -o {{ mig_roles_meta_list }} - async: 3600 - poll: 0 + async: "{{ (3600 if ASYNC_ENABLED else omit) | default(omit) }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" register: mig_build_job - name: Fail if MIG build job did not start diff --git a/roles/web-app-nextcloud/tasks/03_admin.yml b/roles/web-app-nextcloud/tasks/03_admin.yml index 69f0d9c8..a39b0d0f 100644 --- a/roles/web-app-nextcloud/tasks/03_admin.yml +++ b/roles/web-app-nextcloud/tasks/03_admin.yml @@ -3,9 +3,12 @@ docker exec -u {{ nextcloud_docker_user }} {{ nextcloud_container }} php occ group:adduser admin {{ nextcloud_administrator_username }} register: add_admin_to_group - changed_when: "'Added user' in (add_admin_to_group.stdout | default(''))" + changed_when: "not ASYNC_ENABLED and 'Added user' in (add_admin_to_group.stdout | default(''))" failed_when: > + not ASYNC_ENABLED and (add_admin_to_group.rc != 0) and ("is already a member of" not in ( (add_admin_to_group.stderr | default('')) ~ (add_admin_to_group.stdout | default('')) - )) \ No newline at end of file + )) + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" \ No newline at end of file diff --git a/roles/web-app-nextcloud/tasks/04_system_config.yml b/roles/web-app-nextcloud/tasks/04_system_config.yml index dfcef188..84c47ae7 100644 --- a/roles/web-app-nextcloud/tasks/04_system_config.yml +++ b/roles/web-app-nextcloud/tasks/04_system_config.yml @@ -14,6 +14,9 @@ executable: /bin/bash register: syscfg_shell changed_when: > + not ASYNC_ENABLED and ( ((syscfg_shell.stdout | default('')) ~ (syscfg_shell.stderr | default(''))) is search(' set to ') ) - failed_when: syscfg_shell.rc != 0 + failed_when: not ASYNC_ENABLED and syscfg_shell.rc != 0 + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" diff --git a/roles/web-app-nextcloud/tasks/05_plugin.yml b/roles/web-app-nextcloud/tasks/05_plugin.yml index ed083088..90d52e9d 100644 --- a/roles/web-app-nextcloud/tasks/05_plugin.yml +++ b/roles/web-app-nextcloud/tasks/05_plugin.yml @@ -5,10 +5,10 @@ - name: disable {{ plugin_key }} nextcloud plugin command: "{{ nextcloud_docker_exec_occ }} app:disable {{ plugin_key }}" register: disable_result - failed_when: > - (disable_result.rc | int != 0) - and ('No such app enabled' not in (disable_result.stdout | default('') ~ disable_result.stderr | default(''))) changed_when: > + not ASYNC_ENABLED and ((disable_result.stdout | default('') ~ disable_result.stderr | default('')) is search('disabled')) and (((disable_result.stdout | default('') ~ disable_result.stderr | default('')) is not search('already disabled'))) when: not (plugin_value.enabled | bool) + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" diff --git a/roles/web-app-nextcloud/tasks/06_plugin_routines.yml b/roles/web-app-nextcloud/tasks/06_plugin_routines.yml index 2e707277..d96a9d19 100644 --- a/roles/web-app-nextcloud/tasks/06_plugin_routines.yml +++ b/roles/web-app-nextcloud/tasks/06_plugin_routines.yml @@ -18,6 +18,8 @@ is not search('already disabled')) ) failed_when: false + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" - name: install {{ plugin_key }} nextcloud plugin command: "{{ nextcloud_docker_exec_occ }} app:install {{ plugin_key }}" diff --git a/roles/web-app-nextcloud/tasks/07_plugin_enable_and_configure.yml b/roles/web-app-nextcloud/tasks/07_plugin_enable_and_configure.yml index 230d1afb..d4cca05b 100644 --- a/roles/web-app-nextcloud/tasks/07_plugin_enable_and_configure.yml +++ b/roles/web-app-nextcloud/tasks/07_plugin_enable_and_configure.yml @@ -29,8 +29,11 @@ when: plugin_vars_file.stat.exists register: config_set_shell changed_when: > + not ASYNC_ENABLED and (config_set_shell.stdout | default('')) is search(' set to ') - failed_when: config_set_shell.rc != 0 + failed_when: not ASYNC_ENABLED and config_set_shell.rc != 0 + async: "{{ ASYNC_TIME if ASYNC_ENABLED else omit }}" + poll: "{{ ASYNC_POLL if ASYNC_ENABLED else omit }}" - name: Check if {{nextcloud_control_node_plugin_tasks_directory}}{{ plugin_key }}.yml exists stat: