diff --git a/files/ansible-playbooks/sot-updater.yml b/files/ansible-playbooks/sot-updater.yml index 007972d..2720718 100644 --- a/files/ansible-playbooks/sot-updater.yml +++ b/files/ansible-playbooks/sot-updater.yml @@ -177,7 +177,6 @@ nb_small: "{{ nb_kv.get('small','') }}" nb_ok_line: "{{ nb_ok_line }}" - - name: "NB preflight | Detect IP change" when: nb_script.stat.exists delegate_to: localhost @@ -820,6 +819,29 @@ payload_encoding: "string" changed_when: false + # ----------------------- Dev1 hostname (for Dev2 mismatch check) ----------------------- + - name: Dev1 | Read kernel hostname + delegate_to: localhost + shell: | + sshpass -p '{{ dev1_pass }}' ssh {{ ssh_opts_common }} \ + "{{ dev1_user }}@{{ ansible_host|default(inventory_hostname) }}" \ + "cat /proc/sys/kernel/hostname 2>/dev/null || hostname 2>/dev/null || echo ''" + args: + executable: /bin/bash + register: dev1_hostname_raw + changed_when: false + failed_when: false + ignore_errors: true + + - name: Dev1 | Normalize hostname + delegate_to: localhost + set_fact: + dev1_hostname: >- + {{ + (dev1_hostname_raw.stdout | default('') | trim) + if ((dev1_hostname_raw.stdout | default('') | trim | length) > 0) + else (inventory_hostname | default('')) + }} # ----------------------- Dev2 auth + firmux ----------------------- - name: Try DEV2 login @@ -1002,7 +1024,6 @@ ignore_errors: true # ------ LLDP IPv6 fallback (Dev1 → Dev2 on link-local) ------ - - name: Dev1 | Try LLDP-derived Dev2 IPv6 (auth to Dev2 failed, IPv4 LLDP unusable) when: - tunnel_ok | default(false) @@ -1100,7 +1121,6 @@ msg: - "LLDP IPv6 candidate={{ lldp_dev2_ip6 | default('') }}" - "LLDP IPv6 auth rc={{ dev2_auth_lldp6.rc | default('n/a') }}" - - "LLDP IPv6 auth stdout='{{ dev2_auth_lldp6.stdout | default('') | trim }}'" - name: Set dev2_passfile_used_lldp6 when: @@ -1160,7 +1180,6 @@ failed_when: false ignore_errors: true - - name: Dev2 | Read firmux (direct LLDP IP) when: - tunnel_ok | default(false) @@ -1195,7 +1214,6 @@ ) }} - - name: Dev2 | firmux selection debug delegate_to: localhost debug: @@ -1320,7 +1338,6 @@ failed_when: false ignore_errors: true - - name: Dev2 | Select fw_printenv size output delegate_to: localhost set_fact: @@ -1351,7 +1368,6 @@ ) }} - - name: Dev2 | Normalize indoor_bootenv value delegate_to: localhost set_fact: @@ -1385,7 +1401,153 @@ payload_encoding: "string" changed_when: false + # ----------------------- Dev2 hostname check + publish ----------------------- + - name: Dev2 | Read hostname (tunnel) + when: + - tunnel_ok | default(false) + - dev2_passfile_used != 'NONE' + delegate_to: localhost + shell: | + PORT="{{ _local_port }}" + sshpass -f "{{ dev2_passfile_used }}" ssh {{ ssh_opts_common }} \ + -o ConnectTimeout={{ ssh_timeout }} \ + -p "$PORT" "{{ dev2_ssh_user }}@127.0.0.1" \ + "cat /proc/sys/kernel/hostname 2>/dev/null || hostname 2>/dev/null || echo ''" + args: + executable: /bin/bash + register: dev2_hostname_tunnel + changed_when: false + failed_when: false + ignore_errors: true + - name: Dev2 | Read hostname (LLDP IPv4) + when: + - tunnel_ok | default(false) + - dev2_passfile_used == 'NONE' + - lldp_dev2_ip | length > 0 + - dev2_passfile_used_lldp is defined + - dev2_passfile_used_lldp != 'NONE' + delegate_to: localhost + shell: | + sshpass -f "{{ dev2_passfile_used_lldp }}" ssh \ + -o StrictHostKeyChecking=no -o PubkeyAuthentication=no \ + -o ConnectTimeout=15 \ + "{{ dev2_ssh_user }}@{{ lldp_dev2_ip }}" \ + "cat /proc/sys/kernel/hostname 2>/dev/null || hostname 2>/dev/null || echo ''" + args: + executable: /bin/bash + register: dev2_hostname_lldp + changed_when: false + failed_when: false + ignore_errors: true + + - name: Dev2 | Read hostname (LLDP IPv6 via Dev1) + when: + - tunnel_ok | default(false) + - dev2_passfile_used == 'NONE' + - (dev2_passfile_used_lldp is not defined or dev2_passfile_used_lldp == 'NONE') + - lldp_dev2_ip6 is defined + - lldp_dev2_ip6 | length > 0 + - dev2_passfile_used_lldp6 is defined + - dev2_passfile_used_lldp6 != 'NONE' + delegate_to: localhost + shell: | + IP6="{{ lldp_dev2_ip6 }}" + F="{{ dev2_passfile_used_lldp6 }}" + if [ -z "$IP6" ] || [ -z "$F" ] || [ "$F" = "NONE" ]; then + exit 0 + fi + + sshpass -p '{{ dev1_pass }}' ssh {{ ssh_opts_common }} \ + "{{ dev1_user }}@{{ ansible_host|default(inventory_hostname) }}" \ + "sshpass -f '/tmp/${F}' ssh \ + -o StrictHostKeyChecking=no -o PubkeyAuthentication=no \ + -o ConnectTimeout={{ ssh_timeout }} \ + '{{ dev2_ssh_user }}@\[${IP6}%{{ dev1_iface }}\]' \ + 'cat /proc/sys/kernel/hostname 2>/dev/null || hostname 2>/dev/null || echo '''" + args: + executable: /bin/bash + register: dev2_hostname_lldp6 + changed_when: false + failed_when: false + ignore_errors: true + + - name: Dev2 | Select hostname output + delegate_to: localhost + set_fact: + indoor_hostname_raw: >- + {{ + (dev2_hostname_tunnel.stdout | default('') | trim) + if ( + (dev2_hostname_tunnel is defined) and + ((dev2_hostname_tunnel.stdout | default('') | trim | length) > 0) + ) + else ( + (dev2_hostname_lldp.stdout | default('') | trim) + if ( + (dev2_hostname_lldp is defined) and + ((dev2_hostname_lldp.stdout | default('') | trim | length) > 0) + ) + else ( + (dev2_hostname_lldp6.stdout | default('') | trim) + if ( + (dev2_hostname_lldp6 is defined) and + ((dev2_hostname_lldp6.stdout | default('') | trim | length) > 0) + ) + else '' + ) + ) + }} + + - name: Dev2 | Normalize indoor_hostname + delegate_to: localhost + set_fact: + indoor_hostname_value: >- + {{ + 'unavailable' + if (indoor_hostname_raw | default('') | trim) == '' + else ( + ( + '!' ~ (indoor_hostname_raw | default('') | trim) + ) + if ( + (dev1_hostname | default(inventory_hostname)) + != (indoor_hostname_raw | default('') | trim) + ) + else (indoor_hostname_raw | default('') | trim) + ) + }} + + - name: Dev2 | indoor_hostname debug + delegate_to: localhost + debug: + msg: + - "dev1_hostname={{ dev1_hostname | default('n/a') }}" + - "indoor_hostname_raw={{ indoor_hostname_raw | default('n/a') }}" + - "indoor_hostname_value={{ indoor_hostname_value | default('n/a') }}" + + - name: Publish Dev2 indoor_hostname custom field + delegate_to: localhost + 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: "{{ { + 'inscope_device': (ansible_hostname|default(inventory_hostname)), + 'task_name': 'custom_field_set', + 'task_add1': 'indoor_hostname', + 'task_result': indoor_hostname_value + } | to_json }}" + payload_encoding: "string" + changed_when: false post_tasks: - name: "✅ Cleanup start"