From 2c61021830c0cf0c9f039eca30b1dd2440213b8c Mon Sep 17 00:00:00 2001 From: jakub Date: Sat, 21 Mar 2026 08:28:39 +0000 Subject: [PATCH] Update mikrotikbackup_clean.yml --- mikrotikbackup_clean.yml | 162 +++++++++++++++++---------------------- 1 file changed, 70 insertions(+), 92 deletions(-) diff --git a/mikrotikbackup_clean.yml b/mikrotikbackup_clean.yml index e0935cb..c505005 100644 --- a/mikrotikbackup_clean.yml +++ b/mikrotikbackup_clean.yml @@ -21,27 +21,27 @@ tags: always - name: Parse router name - ansible.builtin.set_fact: + set_fact: router_name: "{{ identity_raw.stdout[0].split(': ')[1] | trim }}" tags: always - name: Get timestamp - ansible.builtin.command: date +%Y-%m-%d_%H-%M-%S + command: date +%Y-%m-%d_%H-%M-%S register: date_out delegate_to: localhost changed_when: false tags: always - - name: Set timestamp fact - ansible.builtin.set_fact: + - name: Set timestamp + set_fact: ts: "{{ date_out.stdout }}" tags: always # ---------------------------- - # Backup (tag: backup) + # Backup # ---------------------------- - - name: Ensure local backup directory exists - ansible.builtin.file: + - name: Ensure backup directory exists + file: path: "{{ backup_dir }}" state: directory mode: "0755" @@ -55,7 +55,7 @@ tags: backup - name: Save export locally - ansible.builtin.copy: + copy: content: "{{ export_cfg.stdout[0] }}" dest: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" mode: "0600" @@ -63,89 +63,84 @@ tags: backup - name: Mark backup success - ansible.builtin.set_fact: - backup_ok: true + set_fact: backup_file: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" tags: backup # ---------------------------- - # Upgrade (tag: upgrade) + # Upgrade # ---------------------------- - name: Trigger update check community.routeros.command: commands: /system package update check-for-updates once tags: upgrade - - name: Wait before reading update info - ansible.builtin.pause: + - name: Wait for MikroTik update check + pause: seconds: 5 tags: upgrade - - name: Get update info (plain) + - name: Get update info community.routeros.command: commands: /system package update print register: update_info tags: upgrade # ---------------------------- - # Parse versions (FIXED) + # SAFE parsing (NO CRASH) # ---------------------------- - - name: Parse installed and latest versions - ansible.builtin.set_fact: + - name: Parse versions safely + set_fact: installed_version: >- {{ (update_info.stdout[0] - | regex_search('installed-version: ([^\\s]+)', '\\1') - | default(['unknown'], true)) - | first + | regex_search('installed-version: ([^\\s]+)') + | default('installed-version: unknown')) + | regex_replace('installed-version: ', '') }} latest_version: >- {{ (update_info.stdout[0] - | regex_search('latest-version: ([^\\s]+)', '\\1') - | default(['unknown'], true)) - | first + | regex_search('latest-version: ([^\\s]+)') + | default('latest-version: unknown')) + | regex_replace('latest-version: ', '') }} update_status: >- {{ (update_info.stdout[0] - | regex_search('status: (.+)', '\\1') - | default(['unknown'], true)) - | first + | regex_search('status: (.+)') + | default('status: unknown')) + | regex_replace('status: ', '') }} update_channel: >- {{ (update_info.stdout[0] - | regex_search('channel: ([^\\s]+)', '\\1') - | default(['unknown'], true)) - | first + | regex_search('channel: ([^\\s]+)') + | default('channel: unknown')) + | regex_replace('channel: ', '') }} tags: upgrade - - name: Debug parsed update info - ansible.builtin.debug: - msg: "Router={{ router_name }} channel={{ update_channel }} installed={{ installed_version }} latest={{ latest_version }} status={{ update_status }}" + - name: Debug parsed values + debug: + msg: > + router={{ router_name }} + channel={{ update_channel }} + installed={{ installed_version }} + latest={{ latest_version }} + status={{ update_status }} tags: upgrade # ---------------------------- - # Detect problems (FIXED) + # Logic # ---------------------------- - name: Detect update failure - ansible.builtin.set_fact: + set_fact: update_failed: "{{ 'error' in (update_status | lower) or 'failed' in (update_status | lower) }}" tags: upgrade - - name: Warn if update failed - ansible.builtin.debug: - msg: "WARNING: Update check failed on {{ router_name }} (status={{ update_status }})" - when: update_failed - tags: upgrade - - # ---------------------------- - # Decide upgrade - # ---------------------------- - - name: Set upgrade-needed fact - ansible.builtin.set_fact: + - name: Decide upgrade + set_fact: upgrade_needed: >- {{ not update_failed and @@ -156,28 +151,28 @@ tags: upgrade - name: Show decision - ansible.builtin.debug: + debug: msg: "Router={{ router_name }} installed={{ installed_version }} latest={{ latest_version }} upgrade_needed={{ upgrade_needed }}" tags: upgrade - - name: Skip upgrade if already latest - ansible.builtin.debug: - msg: "Router {{ router_name }} is already on latest version {{ installed_version }}" + - name: Skip upgrade + debug: + msg: "Router {{ router_name }} is already up to date ({{ installed_version }})" when: not upgrade_needed tags: upgrade # ---------------------------- - # Perform upgrade + # Upgrade # ---------------------------- - - name: Trigger package download and install + - name: Install update community.routeros.command: commands: /system package update install - register: upgrade_result when: upgrade_needed + register: upgrade_result tags: upgrade - - name: Wait for router to come back online after reboot - ansible.builtin.wait_for_connection: + - name: Wait for reboot + wait_for_connection: delay: 180 timeout: 600 sleep: 10 @@ -186,72 +181,61 @@ - upgrade_result is succeeded tags: upgrade - - name: Confirm upgraded version + - name: Confirm version community.routeros.command: commands: /system resource print register: post_upgrade_info when: upgrade_needed tags: upgrade - - name: Parse post-upgrade version - ansible.builtin.set_fact: - post_upgrade_version: "{{ post_upgrade_info.stdout[0] | regex_search('version: ([^\\s]+)', '\\1') | default('unknown', true) }}" - when: upgrade_needed - tags: upgrade - - - name: Show post-upgrade RouterOS version - ansible.builtin.debug: - msg: "Router {{ router_name }} upgraded to version {{ post_upgrade_version }}" + - name: Parse new version + set_fact: + post_upgrade_version: >- + {{ + (post_upgrade_info.stdout[0] + | regex_search('version: ([^\\s]+)') + | default('version: unknown')) + | regex_replace('version: ', '') + }} when: upgrade_needed tags: upgrade # ---------------------------- - # Build Checkmk status + # Checkmk result # ---------------------------- - - name: Build Checkmk result when no upgrade was needed - ansible.builtin.set_fact: + - name: Result when no upgrade + set_fact: cmk_state: "{{ 2 if update_failed else 0 }}" cmk_output: >- {{ 'CRIT' if update_failed else 'OK' }} - router={{ router_name }} - backup=ok installed={{ installed_version }} latest={{ latest_version }} - status={{ update_status }} + status="{{ update_status }}" upgrade_needed=no - backup_file={{ backup_file | default('n/a') }} - backup_ts={{ ts }} when: not upgrade_needed tags: always - - name: Build Checkmk result when upgrade succeeded - ansible.builtin.set_fact: + - name: Result when upgrade happened + set_fact: cmk_state: "{{ 0 if post_upgrade_version == latest_version else 2 }}" cmk_output: >- {{ 'OK' if post_upgrade_version == latest_version else 'CRIT' }} - router={{ router_name }} - backup=ok - installed_before={{ installed_version }} - latest={{ latest_version }} - status={{ update_status }} - upgrade_needed=yes upgraded_to={{ post_upgrade_version }} - backup_file={{ backup_file | default('n/a') }} - backup_ts={{ ts }} when: upgrade_needed tags: always # ---------------------------- - # Push result to Checkmk + # Send to Checkmk # ---------------------------- - - name: Send result to Checkmk + - name: Send to Checkmk delegate_to: localhost - ansible.builtin.uri: + uri: url: "{{ checkmk_url }}" method: POST headers: Authorization: "Bearer {{ lookup('env', 'CHECKMK_TOKEN') }}" - Accept: "application/json" Content-Type: "application/json" body_format: json body: @@ -259,16 +243,10 @@ service_description: "{{ checkmk_service_description }}" state: "{{ cmk_state | int }}" output: "{{ cmk_output }}" - return_content: true - status_code: - - 200 - - 201 - - 204 - register: checkmk_result failed_when: false tags: always - name: Show Checkmk response - ansible.builtin.debug: - var: checkmk_result + debug: + var: cmk_output tags: always \ No newline at end of file