diff --git a/mikrotikbackup_clean.yml b/mikrotikbackup_clean.yml index dd90e9a..1245a0e 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: + set_fact: ts: "{{ date_out.stdout }}" tags: always # ---------------------------- - # Backup (tag: backup) + # Backup # ---------------------------- - name: Ensure local backup directory exists - ansible.builtin.file: + 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,42 +63,53 @@ tags: backup - name: Mark backup success - ansible.builtin.set_fact: + set_fact: backup_ok: true backup_file: "{{ backup_dir }}/{{ router_name }}-{{ ts }}.rsc" tags: backup # ---------------------------- - # Upgrade (tag: upgrade) + # Upgrade # ---------------------------- - - name: Check current and latest available package versions + - name: Check updates (try structured output) + community.routeros.command: + commands: /system package update check-for-updates once as-value + register: update_check_struct + ignore_errors: true + tags: upgrade + + - name: Fallback to plain output if structured failed community.routeros.command: commands: /system package update check-for-updates - register: update_check + register: update_check_plain + when: update_check_struct is failed tags: upgrade - - name: Parse installed and latest versions - ansible.builtin.set_fact: - installed_version: >- - {{ - ( - update_check.stdout[0] - | regex_search('installed-version: ([^\\s]+)', '\\1') - | default([]) - ) | first | default('unknown') - }} - latest_version: >- - {{ - ( - update_check.stdout[0] - | regex_search('latest-version: ([^\\s]+)', '\\1') - | default([]) - ) | first | default('unknown') - }} + # ---------------------------- + # Parse versions (structured) + # ---------------------------- + - name: Parse versions from structured output + set_fact: + installed_version: "{{ update_check_struct.stdout[0]['installed-version'] | default('unknown') }}" + latest_version: "{{ update_check_struct.stdout[0]['latest-version'] | default('unknown') }}" + when: update_check_struct is succeeded tags: upgrade + # ---------------------------- + # Parse versions (fallback regex) + # ---------------------------- + - name: Parse versions from plain output + set_fact: + installed_version: "{{ update_check_plain.stdout[0] | regex_search('installed-version: ([^\\s]+)', '\\1') | default('unknown', true) }}" + latest_version: "{{ update_check_plain.stdout[0] | regex_search('latest-version: ([^\\s]+)', '\\1') | default('unknown', true) }}" + when: update_check_struct is failed + tags: upgrade + + # ---------------------------- + # Decide upgrade + # ---------------------------- - name: Set upgrade-needed fact - ansible.builtin.set_fact: + set_fact: upgrade_needed: >- {{ installed_version != 'unknown' @@ -107,21 +118,29 @@ }} tags: upgrade - - name: Skip upgrade if already on latest - ansible.builtin.debug: - msg: "Router {{ router_name }} is already on latest version {{ installed_version }}. Skipping upgrade." + - name: Show decision + debug: + msg: "Router={{ router_name }} installed={{ installed_version }} latest={{ latest_version }} upgrade_needed={{ upgrade_needed }}" + tags: upgrade + + - name: Skip upgrade if already latest + debug: + msg: "Router {{ router_name }} is already up to date ({{ installed_version }})" when: not upgrade_needed tags: upgrade - - name: Trigger package download and install + # ---------------------------- + # Perform upgrade + # ---------------------------- + - name: Trigger package install community.routeros.command: commands: /system package update install register: upgrade_result when: upgrade_needed tags: upgrade - - name: Wait for router to come back online after reboot - ansible.builtin.wait_for_connection: + - name: Wait for router to come back + wait_for_connection: delay: 180 timeout: 600 sleep: 10 @@ -138,29 +157,22 @@ 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([]) - ) | first | default('unknown') - }} + 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: Show post-upgrade version + debug: + msg: "Router {{ router_name }} upgraded to {{ post_upgrade_version }}" when: upgrade_needed tags: upgrade # ---------------------------- - # Build Checkmk status + # Build Checkmk result # ---------------------------- - - name: Build Checkmk result when no upgrade was needed - ansible.builtin.set_fact: + - name: Result when no upgrade + set_fact: cmk_state: 0 cmk_output: >- OK - router={{ router_name }} @@ -173,8 +185,8 @@ 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' }} - @@ -190,11 +202,11 @@ tags: always # ---------------------------- - # Push result to Checkmk + # Send to Checkmk # ---------------------------- - name: Send result to Checkmk delegate_to: localhost - ansible.builtin.uri: + uri: url: "{{ checkmk_url }}" method: POST headers: @@ -208,15 +220,12 @@ state: "{{ cmk_state | int }}" output: "{{ cmk_output }}" return_content: true - status_code: - - 200 - - 201 - - 204 + status_code: [200, 201, 204] register: checkmk_result failed_when: false tags: always - name: Show Checkmk response - ansible.builtin.debug: + debug: var: checkmk_result tags: always \ No newline at end of file