diff --git a/mikrotikbackup_clean.yml b/mikrotikbackup_clean.yml index ff2810f..55ab77b 100644 --- a/mikrotikbackup_clean.yml +++ b/mikrotikbackup_clean.yml @@ -18,24 +18,20 @@ community.routeros.command: commands: /system identity print register: identity_raw - tags: always - name: Parse router name set_fact: router_name: "{{ identity_raw.stdout[0].split(': ')[1] | trim }}" - tags: always - name: Get timestamp command: date +%Y-%m-%d_%H-%M-%S register: date_out delegate_to: localhost changed_when: false - tags: always - name: Set timestamp set_fact: ts: "{{ date_out.stdout }}" - tags: always # ---------------------------- # Backup @@ -46,13 +42,11 @@ state: directory mode: "0755" delegate_to: localhost - tags: backup - name: Export router config community.routeros.command: commands: /export terse show-sensitive register: export_cfg - tags: backup - name: Save export locally copy: @@ -60,70 +54,85 @@ dest: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" mode: "0600" delegate_to: localhost - tags: backup - name: Mark backup success set_fact: backup_file: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" - tags: backup # ---------------------------- - # Upgrade check + # Update check # ---------------------------- - name: Trigger update check community.routeros.command: commands: /system package update check-for-updates once - tags: upgrade - - name: Wait for MikroTik update check + - name: Wait for MikroTik pause: seconds: 5 - tags: upgrade - name: Get update info community.routeros.command: commands: /system package update print register: update_info - tags: upgrade # ---------------------------- - # SAFE parsing (FINAL) + # ROBUST PARSING (FINAL FIX) # ---------------------------- - - name: Parse versions safely + - name: Split update output + set_fact: + update_lines: "{{ update_info.stdout[0].split('\n') }}" + + - name: Extract installed version set_fact: installed_version: >- {{ - (update_info.stdout[0] - | regex_search('installed-version: ([^\\s]+)') + (update_lines + | select('search', '^\\s*installed-version:') + | list + | first | default('installed-version: unknown')) - | regex_replace('installed-version: ', '') - | regex_replace('\\s+', '') - }} - latest_version: >- - {{ - (update_info.stdout[0] - | regex_search('latest-version: ([^\\s]+)') - | default('latest-version: unknown')) - | regex_replace('latest-version: ', '') - | regex_replace('\\s+', '') - }} - update_status: >- - {{ - (update_info.stdout[0] - | regex_search('status: ([^\\n]+)') - | default('status: unknown')) - | regex_replace('status: ', '') + | regex_replace('.*installed-version:\\s*', '') | trim }} + + - name: Extract latest version + set_fact: + latest_version: >- + {{ + (update_lines + | select('search', '^\\s*latest-version:') + | list + | first + | default('latest-version: unknown')) + | regex_replace('.*latest-version:\\s*', '') + | trim + }} + + - name: Extract status + set_fact: + update_status: >- + {{ + (update_lines + | select('search', '^\\s*status:') + | list + | first + | default('status: unknown')) + | regex_replace('.*status:\\s*', '') + | trim + }} + + - name: Extract channel + set_fact: update_channel: >- {{ - (update_info.stdout[0] - | regex_search('channel: ([^\\s]+)') + (update_lines + | select('search', '^\\s*channel:') + | list + | first | default('channel: unknown')) - | regex_replace('channel: ', '') - | regex_replace('\\s+', '') + | regex_replace('.*channel:\\s*', '') + | trim }} - tags: upgrade - name: Debug parsed values debug: @@ -133,7 +142,6 @@ installed={{ installed_version }} latest={{ latest_version }} status={{ update_status }} - tags: upgrade # ---------------------------- # Logic @@ -141,7 +149,6 @@ - name: Detect update failure set_fact: update_failed: "{{ 'error' in (update_status | lower) or 'failed' in (update_status | lower) }}" - tags: upgrade - name: Decide upgrade set_fact: @@ -152,28 +159,24 @@ latest_version != 'unknown' and installed_version != latest_version }} - tags: upgrade - name: Show decision debug: msg: "Router={{ router_name }} installed={{ installed_version }} latest={{ latest_version }} upgrade_needed={{ upgrade_needed }}" - tags: upgrade - name: Skip upgrade debug: msg: "Router {{ router_name }} is already up to date ({{ installed_version }})" when: not upgrade_needed - tags: upgrade # ---------------------------- - # Upgrade execution + # Upgrade # ---------------------------- - name: Install update community.routeros.command: commands: /system package update install when: upgrade_needed register: upgrade_result - tags: upgrade - name: Wait for reboot wait_for_connection: @@ -183,14 +186,12 @@ when: - upgrade_needed - upgrade_result is succeeded - tags: upgrade - name: Confirm version community.routeros.command: commands: /system resource print register: post_upgrade_info when: upgrade_needed - tags: upgrade - name: Parse new version set_fact: @@ -200,13 +201,12 @@ | regex_search('version: ([^\\s]+)') | default('version: unknown')) | regex_replace('version: ', '') - | regex_replace('\\s+', '') + | trim }} when: upgrade_needed - tags: upgrade # ---------------------------- - # Checkmk result + # Checkmk # ---------------------------- - name: Result when no upgrade set_fact: @@ -219,7 +219,6 @@ status="{{ update_status }}" upgrade_needed=no when: not upgrade_needed - tags: always - name: Result when upgrade happened set_fact: @@ -229,11 +228,7 @@ router={{ router_name }} upgraded_to={{ post_upgrade_version }} when: upgrade_needed - tags: always - # ---------------------------- - # Send to Checkmk - # ---------------------------- - name: Send to Checkmk delegate_to: localhost uri: @@ -249,9 +244,7 @@ state: "{{ cmk_state | int }}" output: "{{ cmk_output }}" failed_when: false - tags: always - - name: Show Checkmk response + - name: Show Checkmk output debug: - var: cmk_output - tags: always \ No newline at end of file + var: cmk_output \ No newline at end of file