From 534f002f5baf959157deb94733aeb597311d27bb Mon Sep 17 00:00:00 2001 From: jakub Date: Sat, 21 Mar 2026 08:40:46 +0000 Subject: [PATCH] Update mikrotikbackup_clean.yml --- mikrotikbackup_clean.yml | 143 +++++++++++++++++++-------------------- 1 file changed, 70 insertions(+), 73 deletions(-) diff --git a/mikrotikbackup_clean.yml b/mikrotikbackup_clean.yml index 55ab77b..1f3f499 100644 --- a/mikrotikbackup_clean.yml +++ b/mikrotikbackup_clean.yml @@ -3,14 +3,14 @@ hosts: mikrotik_routers gather_facts: no serial: 10 - + vars: backup_dir: /opt/mikrotik_backups/ checkmk_url: "http://checkmk-server/mysite/check_mk/api/1.0/domain-types/service/collections/all" checkmk_service_description: "MikroTik Backup/Upgrade" - + tasks: - + # ---------------------------- # Identity + timestamp # ---------------------------- @@ -18,21 +18,21 @@ community.routeros.command: commands: /system identity print register: identity_raw - + - name: Parse router name set_fact: router_name: "{{ identity_raw.stdout[0].split(': ')[1] | trim }}" - + - name: Get timestamp command: date +%Y-%m-%d_%H-%M-%S register: date_out delegate_to: localhost changed_when: false - + - name: Set timestamp set_fact: ts: "{{ date_out.stdout }}" - + # ---------------------------- # Backup # ---------------------------- @@ -42,98 +42,93 @@ state: directory mode: "0755" delegate_to: localhost - + - name: Export router config community.routeros.command: commands: /export terse show-sensitive register: export_cfg - + - name: Save export locally copy: content: "{{ export_cfg.stdout[0] }}" dest: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" mode: "0600" delegate_to: localhost - + - name: Mark backup success set_fact: backup_file: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" - + # ---------------------------- # Update check # ---------------------------- - name: Trigger update check community.routeros.command: commands: /system package update check-for-updates once - + - name: Wait for MikroTik pause: seconds: 5 - + - name: Get update info community.routeros.command: commands: /system package update print register: update_info - + # ---------------------------- - # ROBUST PARSING (FINAL FIX) + # Debug raw output (remove after confirming parsing works) + # ---------------------------- + - name: Debug raw update output + debug: + msg: "{{ update_info.stdout[0] }}" + + # ---------------------------- + # PARSING — regex_search with capture groups # ---------------------------- - - name: Split update output - set_fact: - update_lines: "{{ update_info.stdout[0].split('\n') }}" - - name: Extract installed version set_fact: installed_version: >- {{ - (update_lines - | select('search', '^\\s*installed-version:') - | list + update_info.stdout[0] + | regex_search('installed-version:\s*(\S+)', '\1') | first - | default('installed-version: unknown')) - | regex_replace('.*installed-version:\\s*', '') + | default('unknown') | trim }} - + - name: Extract latest version set_fact: latest_version: >- {{ - (update_lines - | select('search', '^\\s*latest-version:') - | list + update_info.stdout[0] + | regex_search('latest-version:\s*(\S+)', '\1') | first - | default('latest-version: unknown')) - | regex_replace('.*latest-version:\\s*', '') + | default('unknown') | trim }} - + - name: Extract status set_fact: update_status: >- {{ - (update_lines - | select('search', '^\\s*status:') - | list + update_info.stdout[0] + | regex_search('status:\s*(.+)', '\1') | first - | default('status: unknown')) - | regex_replace('.*status:\\s*', '') + | default('unknown') | trim }} - + - name: Extract channel set_fact: update_channel: >- {{ - (update_lines - | select('search', '^\\s*channel:') - | list + update_info.stdout[0] + | regex_search('channel:\s*(\S+)', '\1') | first - | default('channel: unknown')) - | regex_replace('.*channel:\\s*', '') + | default('unknown') | trim }} - + - name: Debug parsed values debug: msg: > @@ -142,94 +137,96 @@ installed={{ installed_version }} latest={{ latest_version }} status={{ update_status }} - + # ---------------------------- # Logic # ---------------------------- - name: Detect update failure set_fact: update_failed: "{{ 'error' in (update_status | lower) or 'failed' in (update_status | lower) }}" - + - name: Decide upgrade set_fact: upgrade_needed: >- {{ - not update_failed and + not update_failed | bool and installed_version != 'unknown' and latest_version != 'unknown' and installed_version != latest_version }} - + - name: Show decision debug: msg: "Router={{ router_name }} installed={{ installed_version }} latest={{ latest_version }} upgrade_needed={{ upgrade_needed }}" - - - name: Skip upgrade + + - name: Skip upgrade (already up to date) debug: msg: "Router {{ router_name }} is already up to date ({{ installed_version }})" - when: not upgrade_needed - + when: not upgrade_needed | bool + # ---------------------------- # Upgrade # ---------------------------- - name: Install update community.routeros.command: commands: /system package update install - when: upgrade_needed + when: upgrade_needed | bool register: upgrade_result - + - name: Wait for reboot wait_for_connection: delay: 180 timeout: 600 sleep: 10 when: - - upgrade_needed + - upgrade_needed | bool - upgrade_result is succeeded - - - name: Confirm version + + - name: Confirm version after upgrade community.routeros.command: commands: /system resource print register: post_upgrade_info - when: upgrade_needed - + when: upgrade_needed | bool + - name: Parse new version set_fact: post_upgrade_version: >- {{ - (post_upgrade_info.stdout[0] - | regex_search('version: ([^\\s]+)') - | default('version: unknown')) - | regex_replace('version: ', '') + post_upgrade_info.stdout[0] + | regex_search('version:\s*(\S+)', '\1') + | first + | default('unknown') | trim }} - when: upgrade_needed - + when: upgrade_needed | bool + # ---------------------------- # Checkmk # ---------------------------- - - name: Result when no upgrade + - name: Result when no upgrade needed set_fact: - cmk_state: "{{ 2 if update_failed else 0 }}" + cmk_state: "{{ 2 if update_failed | bool else 0 }}" cmk_output: >- - {{ 'CRIT' if update_failed else 'OK' }} - + {{ 'CRIT' if update_failed | bool else 'OK' }} - router={{ router_name }} installed={{ installed_version }} latest={{ latest_version }} status="{{ update_status }}" upgrade_needed=no - when: not upgrade_needed - + when: not upgrade_needed | bool + - 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 }} + upgraded_from={{ installed_version }} upgraded_to={{ post_upgrade_version }} - when: upgrade_needed - - - name: Send to Checkmk + latest={{ latest_version }} + when: upgrade_needed | bool + + - name: Send result to Checkmk delegate_to: localhost uri: url: "{{ checkmk_url }}" @@ -244,7 +241,7 @@ state: "{{ cmk_state | int }}" output: "{{ cmk_output }}" failed_when: false - + - name: Show Checkmk output debug: var: cmk_output \ No newline at end of file