Compare commits
14 Commits
8519e0f9e7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 7fdf0e59a4 | |||
| e1ae30c4ce | |||
| 8574891864 | |||
| 02e567730a | |||
| f5b82755fd | |||
| 7e7da74f55 | |||
| 398392445e | |||
| f75c5fd2b4 | |||
| 6208ff4c9e | |||
| aa51ba382f | |||
| e1258a554f | |||
| 419834e4ca | |||
| ec1b9838a9 | |||
| 9f6e93827a |
@@ -51,6 +51,79 @@
|
|||||||
failed_when: false
|
failed_when: false
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
|
# ---------------------------- Idempotent temp IP on DEV1 ----------------------------
|
||||||
|
- name: Add temporary IP on DEV1 (tolerate 'File exists')
|
||||||
|
ansible.builtin.raw: >
|
||||||
|
{{ pathprefix }}
|
||||||
|
ip a add {{ dev2_side_ip }} dev {{ dev1_iface }}
|
||||||
|
register: add_ip
|
||||||
|
changed_when: add_ip.rc == 0
|
||||||
|
failed_when: >
|
||||||
|
add_ip.rc != 0
|
||||||
|
and ('File exists' not in (add_ip.stdout | default('')))
|
||||||
|
and ('File exists' not in (add_ip.stderr | default('')))
|
||||||
|
|
||||||
|
- name: Debug result of adding temp IP to DEV1
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg:
|
||||||
|
- "add_ip.rc={{ add_ip.rc | default('') }}"
|
||||||
|
- "add_ip.stdout={{ (add_ip.stdout | default('')) | trim }}"
|
||||||
|
- "add_ip.stderr={{ (add_ip.stderr | default('')) | trim }}"
|
||||||
|
|
||||||
|
# ---------------------------- Discover MAC via bridge FDB and add static ARP ----------------------------
|
||||||
|
- name: Discover DEV2 MAC via bridge fdb on DEV1 (best-effort)
|
||||||
|
ansible.builtin.raw: >
|
||||||
|
{{ pathprefix }}
|
||||||
|
bridge fdb show {{ dev1_iface }} | grep eth0 | grep -v permanent | grep master | awk '{print $1}' | head -n1
|
||||||
|
register: dev2_mac_scan
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Capture discovered DEV2 MAC (if any)
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
dev2_mac: "{{ (dev2_mac_scan.stdout | default('') ) | trim }}"
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Clear existing ARP entry for DEV2 on DEV1 (best-effort)
|
||||||
|
ansible.builtin.raw: >
|
||||||
|
{{ pathprefix }}
|
||||||
|
ip neigh del {{ dev2_host }} dev {{ dev1_iface }} 2>/dev/null || true
|
||||||
|
register: dev2_arp_del
|
||||||
|
changed_when: false
|
||||||
|
failed_when: false
|
||||||
|
|
||||||
|
- name: Add static ARP entry on DEV1 (locks DEV2 IP → discovered MAC)
|
||||||
|
when: dev2_mac is defined and dev2_mac | length > 0
|
||||||
|
ansible.builtin.raw: >
|
||||||
|
{{ pathprefix }}
|
||||||
|
ip neigh add {{ dev2_host }} lladdr {{ dev2_mac }} dev {{ dev1_iface }} nud permanent
|
||||||
|
register: dev2_arp_add
|
||||||
|
changed_when: dev2_arp_add.rc == 0
|
||||||
|
failed_when: >
|
||||||
|
dev2_arp_add.rc != 0
|
||||||
|
and ('File exists' not in (dev2_arp_add.stdout | default('')))
|
||||||
|
and ('File exists' not in (dev2_arp_add.stderr | default('')))
|
||||||
|
|
||||||
|
- name: Debug ARP action summary on DEV1
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg:
|
||||||
|
- "dev2_mac={{ dev2_mac | default('UNSET') }}"
|
||||||
|
- "arp_add.rc={{ dev2_arp_add.rc | default('') }}"
|
||||||
|
- "arp_add.out={{ (dev2_arp_add.stdout | default('')) | trim }}"
|
||||||
|
- "arp_add.err={{ (dev2_arp_add.stderr | default('')) | trim }}"
|
||||||
|
|
||||||
|
- name: Note skipping static ARP add (no MAC discovered)
|
||||||
|
when: dev2_mac is not defined or dev2_mac | length == 0
|
||||||
|
ansible.builtin.debug:
|
||||||
|
msg: "No suitable dynamic MAC found via bridge fdb; skipping static ARP add on DEV1"
|
||||||
|
|
||||||
|
# ---------------------------- ARP refresh ----------------------------
|
||||||
|
- name: Refresh ARP #1
|
||||||
|
ansible.builtin.raw: "{{ pathprefix }} arping -U -I {{ arping_iface }} {{ dev2_side_ip_addr }} -c 3"
|
||||||
|
failed_when: false
|
||||||
|
ignore_errors: true
|
||||||
|
|
||||||
|
|
||||||
- name: Refresh ARP #1
|
- name: Refresh ARP #1
|
||||||
raw: "{{ pathprefix }} arping -U -I {{ arping_iface }} {{ dev2_side_ip_addr }} -c 3"
|
raw: "{{ pathprefix }} arping -U -I {{ arping_iface }} {{ dev2_side_ip_addr }} -c 3"
|
||||||
failed_when: false
|
failed_when: false
|
||||||
@@ -125,15 +198,25 @@
|
|||||||
failed_when: false
|
failed_when: false
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Dev1 | Normalize banner (X.X.X-rYYYY)
|
- name: Dev1 | Normalize banner → X.X.X-rYYYY (POSIX tools)
|
||||||
|
delegate_to: localhost
|
||||||
|
shell: |
|
||||||
|
printf '%s\n' "{{ dev1_banner.stdout | trim }}" \
|
||||||
|
| awk -F '|' '{print $1}' \
|
||||||
|
| sed -E 's/[[:space:]]+rev[[:space:]]+/-r/' \
|
||||||
|
| grep -Eo '[0-9]+\.[0-9]+\.[0-9]+-r[0-9]+' || true
|
||||||
|
register: dev1_fw_clean_cmd
|
||||||
|
changed_when: false
|
||||||
|
|
||||||
|
- name: Dev1 | Set final fw string
|
||||||
delegate_to: localhost
|
delegate_to: localhost
|
||||||
set_fact:
|
set_fact:
|
||||||
dev1_fw_clean: >-
|
dev1_fw_clean: "{{ dev1_fw_clean_cmd.stdout | trim }}"
|
||||||
{{
|
|
||||||
(dev1_banner.stdout | default('') | regex_search('[0-9]+\\.[0-9]+\\.[0-9]+-r[0-9]+'))
|
- name: Debug Dev1 normalized firmware
|
||||||
| default('', true)
|
delegate_to: localhost
|
||||||
| trim
|
debug:
|
||||||
}}
|
msg: "Dev1 fw_version {{ dev1_fw_clean | default('N/A') }}"
|
||||||
|
|
||||||
- name: Publish Dev1 fw_version
|
- name: Publish Dev1 fw_version
|
||||||
delegate_to: localhost
|
delegate_to: localhost
|
||||||
@@ -202,13 +285,31 @@
|
|||||||
failed_when: false
|
failed_when: false
|
||||||
ignore_errors: true
|
ignore_errors: true
|
||||||
|
|
||||||
- name: Dev2 | Extract firmware version line
|
- name: Dev2 | Extract firmware version line (prefer 'rev', else first non-empty)
|
||||||
delegate_to: localhost
|
delegate_to: localhost
|
||||||
|
run_once: true
|
||||||
set_fact:
|
set_fact:
|
||||||
indoor_fw_norm: >-
|
indoor_fw_norm: >-
|
||||||
{{
|
{{
|
||||||
(dev2_firmux.stdout | default('') | regex_search('.*\\brev\\s*[0-9]+.*'))
|
(
|
||||||
| default('', true)
|
(
|
||||||
|
dev2_firmux.stdout | default('') | regex_replace('\r','')
|
||||||
|
) | split('\n')
|
||||||
|
| map('trim')
|
||||||
|
| select('truthy')
|
||||||
|
| list
|
||||||
|
) | select('match', '(?i).*\\brev\\s*[0-9]+.*')
|
||||||
|
| list
|
||||||
|
| first
|
||||||
|
| default(
|
||||||
|
((dev2_firmux.stdout | default('') | regex_replace('\r',''))
|
||||||
|
| split('\n')
|
||||||
|
| map('trim')
|
||||||
|
| select('truthy')
|
||||||
|
| list
|
||||||
|
| first
|
||||||
|
| default(''))
|
||||||
|
)
|
||||||
| trim
|
| trim
|
||||||
}}
|
}}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user