From b49fdc509e81338a402003a17204ce0fd3b2819c Mon Sep 17 00:00:00 2001 From: Kevin Veen-Birkenbach Date: Tue, 19 Aug 2025 13:35:39 +0200 Subject: [PATCH] Refactor alarm compose service and systemctl templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fixed bug where not both alarm services (email + telegram) were triggered. - Removed direct OnFailure references for email and telegram, now handled by unified compose service. - Introduced 01_core.yml in sys-ctl-alm-compose to structure role execution (subservices → core service → test run). - Added configurable variables SYSTEMCTL_ALARM_COMPOSER_SUBSERVICES and SYSTEMCTL_ALARM_COMPOSER_DUMMY_MESSAGE. - Replaced dedicated @.service template with generic systemctl template using systemctl_tpl_* variables for flexibility. - Updated script.sh.j2 to collect exit codes and print clear errors. - Fixed typos and streamlined vars in sys-systemctl. See conversation: https://chatgpt.com/share/68a46172-7c3c-800f-a69c-0cb9edd6839f --- group_vars/all/07_services.yml | 2 -- roles/sys-ctl-alm-compose/tasks/01_core.yml | 25 +++++++++++++++++++ roles/sys-ctl-alm-compose/tasks/main.yml | 12 +-------- .../templates/script.sh.j2 | 11 ++++++++ .../templates/systemctl@.service.j2 | 10 -------- roles/sys-ctl-alm-compose/vars/main.yml | 8 +++++- .../templates/systemctl.service.j2 | 8 +++--- roles/sys-systemctl/vars/main.yml | 9 +++++-- 8 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 roles/sys-ctl-alm-compose/tasks/01_core.yml create mode 100644 roles/sys-ctl-alm-compose/templates/script.sh.j2 delete mode 100644 roles/sys-ctl-alm-compose/templates/systemctl@.service.j2 diff --git a/group_vars/all/07_services.yml b/group_vars/all/07_services.yml index c1ec6121..8a98485e 100644 --- a/group_vars/all/07_services.yml +++ b/group_vars/all/07_services.yml @@ -17,8 +17,6 @@ SYS_SERVICE_UPDATE_DOCKER: "{{ 'update-docker' | get_servic ## On Failure SYS_SERVICE_ON_FAILURE_COMPOSE: "{{ 'sys-ctl-alm-compose' | get_service_name(SOFTWARE_NAME,'%i.service') }}" -SYS_SERVICE_ON_FAILURE_EMAIL: "{{ 'sys-ctl-alm-email' | get_service_name(SOFTWARE_NAME,'%i.service') }}" -SYS_SERVICE_ON_FAILURE_TELEGRAM: "{{ 'sys-ctl-alm-telegram' | get_service_name(SOFTWARE_NAME,'%i.service') }}" ## Groups SYS_SERVICE_GROUP_BACKUPS: > diff --git a/roles/sys-ctl-alm-compose/tasks/01_core.yml b/roles/sys-ctl-alm-compose/tasks/01_core.yml new file mode 100644 index 00000000..38c62066 --- /dev/null +++ b/roles/sys-ctl-alm-compose/tasks/01_core.yml @@ -0,0 +1,25 @@ +- name: "Include dependent services for '{{ systemctl_id }}'" + include_role: + name: '{{ item }}' + loop: + - sys-ctl-alm-telegram + - sys-ctl-alm-email + vars: + flush_handlers: true + systemctl_timer_enabled: false + systemctl_copy_files: true + +- name: "Include core service for '{{ systemctl_id }}'" + include_role: + name: sys-systemctl + vars: + flush_handlers: true + systemctl_timer_enabled: false + systemctl_copy_files: true + systemctl_tpl_exec_start: "{{ systemctl_script_exec }} %i" + systemctl_tpl_on_failure: "" # No on failure needed, because it's anyhow the default on failure procedure + +- name: "Send message to test service." + systemd: + name: "sys-ctl-alm-compose@{{ SYSTEMCTL_ALARM_COMPOSER_DUMMY_MESSAGE }}.service" + state: started \ No newline at end of file diff --git a/roles/sys-ctl-alm-compose/tasks/main.yml b/roles/sys-ctl-alm-compose/tasks/main.yml index b1fd6e2d..48e82c59 100644 --- a/roles/sys-ctl-alm-compose/tasks/main.yml +++ b/roles/sys-ctl-alm-compose/tasks/main.yml @@ -1,14 +1,4 @@ - block: - - name: "Include '{{ systemctl_id }}'" - include_role: - name: '{{ item }}' - loop: - - sys-ctl-alm-telegram - - sys-ctl-alm-email - - sys-systemctl - vars: - flush_handlers: true - systemctl_timer_enabled: false - systemctl_copy_files: false + - include_tasks: 01_core.yml - include_tasks: utils/run_once.yml when: run_once_sys_ctl_alm_compose is not defined diff --git a/roles/sys-ctl-alm-compose/templates/script.sh.j2 b/roles/sys-ctl-alm-compose/templates/script.sh.j2 new file mode 100644 index 00000000..2c4de51f --- /dev/null +++ b/roles/sys-ctl-alm-compose/templates/script.sh.j2 @@ -0,0 +1,11 @@ +#!/bin/bash +err=0 +set -u +{% for alarm_service in SYSTEMCTL_ALARM_COMPOSER_SUBSERVICES %} +{% set alarm_service_full_name = alarm_service | get_service_name(SOFTWARE_NAME, '"$1".service') %} +if ! /usr/bin/systemctl start {{ alarm_service_full_name }}; then + echo "ERROR: Failed to start {{ alarm_service_full_name }}" >&2 + err=1 +fi +{% endfor %} +exit $err diff --git a/roles/sys-ctl-alm-compose/templates/systemctl@.service.j2 b/roles/sys-ctl-alm-compose/templates/systemctl@.service.j2 deleted file mode 100644 index 529c3fd1..00000000 --- a/roles/sys-ctl-alm-compose/templates/systemctl@.service.j2 +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description={{ SOFTWARE_NAME }} - Alarm Notifier for %i - -[Service] -Type=oneshot -{% for alarm_service in [ SYS_SERVICE_ON_FAILURE_EMAIL, SYS_SERVICE_ON_FAILURE_TELEGRAM ] %} -ExecStart=/usr/bin/systemctl start {{ alarm_service }} -{% endfor %} -User=root -Group=systemd-journal diff --git a/roles/sys-ctl-alm-compose/vars/main.yml b/roles/sys-ctl-alm-compose/vars/main.yml index 112d0aaa..c7d1cde6 100644 --- a/roles/sys-ctl-alm-compose/vars/main.yml +++ b/roles/sys-ctl-alm-compose/vars/main.yml @@ -1 +1,7 @@ -systemctl_id: sys-ctl-alm-compose@ \ No newline at end of file +systemctl_id: sys-ctl-alm-compose@ + +SYSTEMCTL_ALARM_COMPOSER_SUBSERVICES: + - 'sys-ctl-alm-email' + - 'sys-ctl-alm-telegram' + +SYSTEMCTL_ALARM_COMPOSER_DUMMY_MESSAGE: "[Info] Dummy Message: No Failure; Ansible is initializing {{ SOFTWARE_NAME }} on {{ inventory_hostname }}." \ No newline at end of file diff --git a/roles/sys-systemctl/templates/systemctl.service.j2 b/roles/sys-systemctl/templates/systemctl.service.j2 index 339a2812..191cc794 100644 --- a/roles/sys-systemctl/templates/systemctl.service.j2 +++ b/roles/sys-systemctl/templates/systemctl.service.j2 @@ -1,7 +1,7 @@ [Unit] -Description=Service for {{ SOFTWARE_NAME }} role '{{ systemctl_id }}' (DEFAULT TEMPLATE) -OnFailure={{ SYS_SERVICE_ON_FAILURE_COMPOSE }} +Description={{ SOFTWARE_NAME }} - Service for role '{{ systemctl_id }}' +OnFailure={{ systemctl_tpl_on_failure }} [Service] -Type=oneshot -ExecStart={{ systemctl_script_exec }} +Type={{ systemctl_tpl_type }} +ExecStart={{ systemctl_tpl_exec_start }} diff --git a/roles/sys-systemctl/vars/main.yml b/roles/sys-systemctl/vars/main.yml index a1e73fad..99257b4f 100644 --- a/roles/sys-systemctl/vars/main.yml +++ b/roles/sys-systemctl/vars/main.yml @@ -7,11 +7,16 @@ systemctl_script_dir: "{{ [ PATH_SYSTEMCTL_SCRIPTS, systemctl_id ] | path_jo ## Settings systemctl_copy_files: true # When set to false file copying will be skipped -systemctl_timer_enabled: false # When set to true timmer will be loaded +systemctl_timer_enabled: false # When set to true timer will be loaded systemctl_state: "{{ SYS_SERVICE_DEFAULT_STATE }}" # Dynamic Loaded ( Just available when dependencies are loaded ) systemctl_script_base: "{{ systemctl_script_src | basename | regex_replace('\\.j2$', '') }}" systemctl_script_type: "{{ systemctl_script_base | filetype }}" systemctl_script_inter: "/bin/{{ 'bash' if systemctl_script_type == 'sh' else 'python3'}}" -systemctl_script_exec: "{{ systemctl_script_inter }} {{ systemctl_id | get_service_script_path( systemctl_script_type ) }}" \ No newline at end of file +systemctl_script_exec: "{{ systemctl_script_inter }} {{ systemctl_id | get_service_script_path( systemctl_script_type ) }}" + +# Service template +systemctl_tpl_on_failure: "{{ SYS_SERVICE_ON_FAILURE_COMPOSE }}" +systemctl_tpl_type: "oneshot" +systemctl_tpl_exec_start: "{{ systemctl_script_exec }}" \ No newline at end of file