1323
This commit is contained in:
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
- name: Stop if connected hostname differs from inventory
|
- name: Stop if connected hostname differs from inventory
|
||||||
ansible.builtin.fail:
|
ansible.builtin.fail:
|
||||||
msg: "Backup-bank prep aborting: connected host reported hostname '{{ host_env.stdout | trim }}' which differs from inventory '{{ inventory_hostname }}'."
|
msg: "Aborting: connected host reported hostname '{{ host_env.stdout | trim }}' which differs from inventory '{{ inventory_hostname }}'."
|
||||||
when: (host_env.stdout | trim) != inventory_hostname
|
when: (host_env.stdout | trim) != inventory_hostname
|
||||||
|
|
||||||
rescue:
|
rescue:
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
- name: Build failure summary text (hostname preflight)
|
- name: Build failure summary text (hostname preflight)
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
fail_summary: >-
|
fail_summary: >-
|
||||||
Outdoor backup preparation aborted at '{{ fail_task_name }}': {{ fail_detail_raw }}
|
Firmware update aborted at '{{ fail_task_name }}': {{ fail_detail_raw }}
|
||||||
|
|
||||||
- name: Truncate failure summary to ~400 chars (hostname preflight)
|
- name: Truncate failure summary to ~400 chars (hostname preflight)
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
@@ -203,7 +203,7 @@
|
|||||||
body_format: json
|
body_format: json
|
||||||
body:
|
body:
|
||||||
properties:
|
properties:
|
||||||
content_type: "application/json"
|
content_type: "application/json"
|
||||||
routing_key: "{{ control_queue }}"
|
routing_key: "{{ control_queue }}"
|
||||||
payload: "{{ {
|
payload: "{{ {
|
||||||
'inscope_device': (ansible_hostname | default(inventory_hostname)),
|
'inscope_device': (ansible_hostname | default(inventory_hostname)),
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
body_format: json
|
body_format: json
|
||||||
body:
|
body:
|
||||||
properties:
|
properties:
|
||||||
content_type: "application/json"
|
content_type: "application/json"
|
||||||
routing_key: "{{ control_queue }}"
|
routing_key: "{{ control_queue }}"
|
||||||
payload: "{{ tag_inprogress_payload | to_json }}"
|
payload: "{{ tag_inprogress_payload | to_json }}"
|
||||||
payload_encoding: "string"
|
payload_encoding: "string"
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
body_format: json
|
body_format: json
|
||||||
body:
|
body:
|
||||||
properties:
|
properties:
|
||||||
content_type: "application/json"
|
content_type: "application/json"
|
||||||
routing_key: "{{ control_queue }}"
|
routing_key: "{{ control_queue }}"
|
||||||
payload: >-
|
payload: >-
|
||||||
{{
|
{{
|
||||||
@@ -295,9 +295,9 @@
|
|||||||
"inscope_device": (ansible_hostname | default(inventory_hostname)),
|
"inscope_device": (ansible_hostname | default(inventory_hostname)),
|
||||||
"task_name": "journal_add",
|
"task_name": "journal_add",
|
||||||
"task_result": (
|
"task_result": (
|
||||||
"Backup preparation already present for " ~ fw_banner_repr ~
|
"Preparation already present for " ~ fw_banner_repr ~
|
||||||
"; marker " ~ fw_marker ~
|
"; marker " ~ fw_marker ~
|
||||||
". Skipping backup preparation steps."
|
". Skipping update steps."
|
||||||
)
|
)
|
||||||
} | to_json
|
} | to_json
|
||||||
}}
|
}}
|
||||||
@@ -365,7 +365,7 @@
|
|||||||
body_format: json
|
body_format: json
|
||||||
body:
|
body:
|
||||||
properties:
|
properties:
|
||||||
content_type: "application/json"
|
content_type: "application/json"
|
||||||
routing_key: "{{ control_queue }}"
|
routing_key: "{{ control_queue }}"
|
||||||
payload: "{{ ssid_journal_payload | to_json }}"
|
payload: "{{ ssid_journal_payload | to_json }}"
|
||||||
payload_encoding: "string"
|
payload_encoding: "string"
|
||||||
@@ -398,79 +398,24 @@
|
|||||||
|
|
||||||
- name: Stop if bootloader environment looks invalid (<7 lines)
|
- name: Stop if bootloader environment looks invalid (<7 lines)
|
||||||
ansible.builtin.fail:
|
ansible.builtin.fail:
|
||||||
msg: "Backup-bank prep aborting: fw_printenv returned only {{ env_line_count.stdout | trim }} lines (<7) — environment missing or corrupted."
|
msg: "Aborting: fw_printenv returned only {{ env_line_count.stdout | trim }} lines (<7) — environment missing or corrupted."
|
||||||
when: (env_line_count.stdout | trim | int) < 7
|
when: (env_line_count.stdout | trim | int) < 7
|
||||||
|
|
||||||
- name: Read /var/run/bootbanks.json (active and backup firmux versions)
|
- name: Read first line of /etc/banner (current running version)
|
||||||
ansible.builtin.raw: "{{ pathprefix }} cat /var/run/bootbanks.json"
|
ansible.builtin.raw: "{{ pathprefix }} cat /etc/banner | grep -i rev | head -n1"
|
||||||
register: bootbanks_raw
|
register: banner
|
||||||
changed_when: false
|
changed_when: false
|
||||||
|
|
||||||
- name: Parse bootbanks.json
|
- name: current version
|
||||||
ansible.builtin.set_fact:
|
|
||||||
bootbanks_obj: "{{ bootbanks_raw.stdout | from_json }}"
|
|
||||||
bootbanks_active_firmux: "{{ (bootbanks_raw.stdout | from_json).active.firmux | default('') }}"
|
|
||||||
bootbanks_backup_firmux: "{{ (bootbanks_raw.stdout | from_json).backup.firmux | default('') }}"
|
|
||||||
failed_when: bootbanks_raw.stdout is not search('"backup"') or bootbanks_raw.stdout is not search('"active"')
|
|
||||||
|
|
||||||
- name: current versions (active primary and backup)
|
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg:
|
msg:
|
||||||
- "active (primary) firmux: {{ bootbanks_active_firmux }}"
|
- "current banner: {{ banner.stdout | trim }}"
|
||||||
- "backup firmux: {{ bootbanks_backup_firmux }}"
|
|
||||||
|
|
||||||
- name: Stop if target version already present on backup (backup already at {{ fw_banner_repr }})
|
- name: Stop if target version matches current (/etc/banner already at {{ fw_banner_repr }})
|
||||||
ansible.builtin.debug:
|
ansible.builtin.fail:
|
||||||
msg: "Backup-bank prep skip: backup already at {{ fw_banner_repr }} (backup firmux: {{ bootbanks_backup_firmux }}; active firmux: {{ bootbanks_active_firmux }}). This playbook prepares backup bootbank only (no flip, no reboot)."
|
msg: "Aborting: device already runs {{ fw_banner_repr }} (banner: {{ banner.stdout | trim }})"
|
||||||
when: bootbanks_backup_firmux is search(fw_banner_repr)
|
when: banner.stdout is search(fw_banner_repr)
|
||||||
|
|
||||||
- name: Build control queue payload for skip journal (journal_add)
|
|
||||||
ansible.builtin.set_fact:
|
|
||||||
journal_skip_payload:
|
|
||||||
inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}"
|
|
||||||
task_name: "journal_add"
|
|
||||||
task_result: >-
|
|
||||||
Backup-bank prep skipped: backup already at {{ fw_banner_repr }}
|
|
||||||
(backup {{ bootbanks_backup_firmux }}; active {{ bootbanks_active_firmux }}).
|
|
||||||
No flip; no reboot.
|
|
||||||
when: nbq2_payload_obj is defined and (bootbanks_backup_firmux is search(fw_banner_repr))
|
|
||||||
|
|
||||||
- name: Bandaid | Pause before Publish skip journal to control queue via RabbitMQ HTTP API
|
|
||||||
ansible.builtin.pause:
|
|
||||||
seconds: 1
|
|
||||||
delegate_to: localhost
|
|
||||||
changed_when: false
|
|
||||||
when: journal_skip_payload is defined
|
|
||||||
|
|
||||||
- name: Publish skip journal to control queue via RabbitMQ HTTP API
|
|
||||||
ansible.builtin.uri:
|
|
||||||
url: "http://{{ rmq_host }}:{{ rmq_port }}/api/exchanges/{{ rmq_vhost | urlencode }}/{{ rmq_exchange | urlencode }}/publish"
|
|
||||||
method: POST
|
|
||||||
user: "{{ rmq_user }}"
|
|
||||||
password: "{{ rmq_pass }}"
|
|
||||||
force_basic_auth: true
|
|
||||||
status_code: 200
|
|
||||||
headers:
|
|
||||||
content-type: "application/json"
|
|
||||||
body_format: json
|
|
||||||
body:
|
|
||||||
properties:
|
|
||||||
content_type: "application/json"
|
|
||||||
routing_key: "{{ control_queue }}"
|
|
||||||
payload: "{{ journal_skip_payload | to_json }}"
|
|
||||||
payload_encoding: "string"
|
|
||||||
delegate_to: localhost
|
|
||||||
register: rmq_journal_skip_resp
|
|
||||||
when: journal_skip_payload is defined
|
|
||||||
|
|
||||||
- name: Log control queue skip journal publish result
|
|
||||||
ansible.builtin.debug:
|
|
||||||
var: rmq_journal_skip_resp.json
|
|
||||||
when: journal_skip_payload is defined and rmq_journal_skip_resp is defined
|
|
||||||
|
|
||||||
- name: End play for this host (backup already prepared; backup prep not needed)
|
|
||||||
ansible.builtin.meta: end_host
|
|
||||||
when: bootbanks_backup_firmux is search(fw_banner_repr)
|
|
||||||
- name: Upload firmware to /tmp via scp (controller-side)
|
- name: Upload firmware to /tmp via scp (controller-side)
|
||||||
ansible.builtin.shell: |
|
ansible.builtin.shell: |
|
||||||
set -e
|
set -e
|
||||||
@@ -576,7 +521,7 @@
|
|||||||
- name: Summary
|
- name: Summary
|
||||||
ansible.builtin.debug:
|
ansible.builtin.debug:
|
||||||
msg:
|
msg:
|
||||||
- "Active (primary) firmux before: {{ bootbanks_active_firmux | default('unknown') }}"
|
- "Active (primary) firmux before: {{ bootbanks_active_firmux }}"
|
||||||
- "Target version: {{ fw_banner_repr }}"
|
- "Target version: {{ fw_banner_repr }}"
|
||||||
- "SHA256: OK ({{ sha_out.stdout | trim }})"
|
- "SHA256: OK ({{ sha_out.stdout | trim }})"
|
||||||
- "update -c: {{ up_check.stdout | trim }}"
|
- "update -c: {{ up_check.stdout | trim }}"
|
||||||
@@ -717,8 +662,8 @@
|
|||||||
inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}"
|
inscope_device: "{{ ansible_hostname | default(inventory_hostname) }}"
|
||||||
task_name: "journal_add"
|
task_name: "journal_add"
|
||||||
task_result: >-
|
task_result: >-
|
||||||
Backup bank prepared for { fw_banner_repr }.
|
Backup bank prepared for {{ fw_banner_repr }}.
|
||||||
Active unchanged; marker { fw_marker }.
|
Active unchanged; marker {{ fw_marker }}.
|
||||||
when: nbq2_payload_obj is defined
|
when: nbq2_payload_obj is defined
|
||||||
|
|
||||||
- name: Bandaid | Pause before Publish success journal to control queue via RabbitMQ HTTP API
|
- name: Bandaid | Pause before Publish success journal to control queue via RabbitMQ HTTP API
|
||||||
@@ -791,7 +736,7 @@
|
|||||||
- name: Build failure summary text
|
- name: Build failure summary text
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
fail_summary: >-
|
fail_summary: >-
|
||||||
Outdoor backup preparation aborted at '{{ fail_task_name }}': {{ fail_detail_raw }}
|
Firmware update aborted at '{{ fail_task_name }}': {{ fail_detail_raw }}
|
||||||
|
|
||||||
- name: Truncate failure summary to ~400 chars
|
- name: Truncate failure summary to ~400 chars
|
||||||
ansible.builtin.set_fact:
|
ansible.builtin.set_fact:
|
||||||
|
|||||||
Reference in New Issue
Block a user