1028
This commit is contained in:
@@ -606,6 +606,132 @@
|
||||
- "DEV2 uptime via {{ dev2_conn_final }}:"
|
||||
- "{{ (dev2_uptime.stdout | default('')) | regex_replace('\r','') }}"
|
||||
|
||||
- name: PHASE 1 | Set local download path for DEV2 config.json
|
||||
delegate_to: localhost
|
||||
ansible.builtin.set_fact:
|
||||
dev2_config_local_dir: "{{ _ctrl_dir | default('/tmp') }}"
|
||||
dev2_config_local_path: "{{ (_ctrl_dir | default('/tmp')) }}/dev2_config_{{ inventory_hostname }}.json"
|
||||
changed_when: false
|
||||
|
||||
- name: PHASE 1 | DEV2 md5sum of /tmp/config.json via wrapper
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
export DEV2_CMD="md5sum /tmp/config.json 2>/dev/null | awk '{print \$1}'"
|
||||
{{ dev2_exec_cmd }}
|
||||
args: { executable: /bin/bash }
|
||||
register: dev2_config_md5
|
||||
changed_when: false
|
||||
failed_when: false
|
||||
|
||||
- name: PHASE 1 | Abort if DEV2 md5 could not be read
|
||||
when: (dev2_config_md5.stdout | default('') | trim | length) == 0
|
||||
ansible.builtin.fail:
|
||||
msg: "DEV2 md5sum for /tmp/config.json is empty; file missing or md5sum unavailable."
|
||||
|
||||
- name: PHASE 1 | Download /tmp/config.json from DEV2 to controller (tunnel)
|
||||
when: dev2_conn_final == "tunnel"
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
set -e
|
||||
PORT="{{ _local_port }}"
|
||||
PASS="{{ dev2_passfile_used_tunnel }}"
|
||||
sshpass -f "$PASS" scp {{ ssh_opts_common }} \
|
||||
-P "$PORT" "{{ dev2_ssh_user }}@127.0.0.1:/tmp/config.json" \
|
||||
"{{ dev2_config_local_path }}"
|
||||
args: { executable: /bin/bash }
|
||||
register: scp_tunnel
|
||||
changed_when: true
|
||||
failed_when: scp_tunnel.rc != 0
|
||||
|
||||
- name: PHASE 1 | Download /tmp/config.json from DEV2 to controller (direct LLDP IPv4)
|
||||
when: dev2_conn_final == "direct_lldp"
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
set -e
|
||||
HOST="{{ lldp_dev2_ip }}"
|
||||
PASS="{{ dev2_passfile_used_direct }}"
|
||||
sshpass -f "$PASS" scp {{ ssh_opts_common }} \
|
||||
"{{ dev2_ssh_user }}@${HOST}:/tmp/config.json" \
|
||||
"{{ dev2_config_local_path }}"
|
||||
args: { executable: /bin/bash }
|
||||
register: scp_direct
|
||||
changed_when: true
|
||||
failed_when: scp_direct.rc != 0
|
||||
|
||||
- name: PHASE 1 | Download /tmp/config.json from DEV2 to controller (LLDP IPv4 fallback)
|
||||
when: dev2_conn_final == "lldp4_fallback"
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
set -e
|
||||
HOST="{{ lldp_dev2_ip }}"
|
||||
PASS="{{ dev2_passfile_used_lldp4 }}"
|
||||
sshpass -f "$PASS" scp {{ ssh_opts_common }} \
|
||||
"{{ dev2_ssh_user }}@${HOST}:/tmp/config.json" \
|
||||
"{{ dev2_config_local_path }}"
|
||||
args: { executable: /bin/bash }
|
||||
register: scp_lldp4
|
||||
changed_when: true
|
||||
failed_when: scp_lldp4.rc != 0
|
||||
|
||||
- name: PHASE 1 | Download /tmp/config.json from DEV2 to controller (LLDP IPv6 via DEV1 nested; last resort)
|
||||
when: dev2_conn_final == "lldp6_via_dev1"
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
set -e
|
||||
IP6="{{ lldp_dev2_ip6 }}"
|
||||
F="{{ dev2_passfile_used_lldp6 }}"
|
||||
TMP_REMOTE="/tmp/config_{{ inventory_hostname }}.json"
|
||||
|
||||
# 1) On DEV1: scp from DEV2 (ipv6 link-local) to DEV1 /tmp
|
||||
sshpass -p "{{ dev1_pass }}" ssh {{ ssh_opts_common }} \
|
||||
"{{ dev1_user }}@{{ ansible_host | default(inventory_hostname) }}" \
|
||||
"sshpass -f '/tmp/${F}' scp \
|
||||
-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=ERROR \
|
||||
-o PreferredAuthentications=password -o PubkeyAuthentication=no -o NumberOfPasswordPrompts=1 \
|
||||
'{{ dev2_ssh_user }}@\[${IP6}%{{ dev1_iface }}\]':/tmp/config.json '${TMP_REMOTE}'"
|
||||
|
||||
# 2) From DEV1 to controller
|
||||
sshpass -p "{{ dev1_pass }}" scp {{ ssh_opts_common }} \
|
||||
"{{ dev1_user }}@{{ ansible_host | default(inventory_hostname) }}:${TMP_REMOTE}" \
|
||||
"{{ dev2_config_local_path }}"
|
||||
|
||||
# 3) Cleanup on DEV1 (best-effort)
|
||||
sshpass -p "{{ dev1_pass }}" ssh {{ ssh_opts_common }} \
|
||||
"{{ dev1_user }}@{{ ansible_host | default(inventory_hostname) }}" \
|
||||
"rm -f '${TMP_REMOTE}' 2>/dev/null || true"
|
||||
args: { executable: /bin/bash }
|
||||
register: scp_lldp6
|
||||
changed_when: true
|
||||
failed_when: scp_lldp6.rc != 0
|
||||
|
||||
- name: PHASE 1 | Controller md5sum of downloaded config.json
|
||||
delegate_to: localhost
|
||||
ansible.builtin.shell: |
|
||||
set -e
|
||||
md5sum "{{ dev2_config_local_path }}" | awk '{print $1}'
|
||||
args: { executable: /bin/bash }
|
||||
register: local_config_md5
|
||||
changed_when: false
|
||||
|
||||
- name: PHASE 1 | Compare DEV2 vs controller md5sum (fail on mismatch)
|
||||
delegate_to: localhost
|
||||
ansible.builtin.fail:
|
||||
msg: >-
|
||||
MD5 mismatch for /tmp/config.json:
|
||||
dev2={{ dev2_config_md5.stdout | trim }},
|
||||
local={{ local_config_md5.stdout | trim }},
|
||||
file={{ dev2_config_local_path }}
|
||||
when: (dev2_config_md5.stdout | trim) != (local_config_md5.stdout | trim)
|
||||
|
||||
- name: PHASE 1 | Debug config.json download + md5
|
||||
when: debugging | bool
|
||||
delegate_to: localhost
|
||||
ansible.builtin.debug:
|
||||
msg:
|
||||
- "Downloaded DEV2 /tmp/config.json to {{ dev2_config_local_path }}"
|
||||
- "DEV2 md5={{ dev2_config_md5.stdout | trim }}"
|
||||
- "Local md5={{ local_config_md5.stdout | trim }}"
|
||||
|
||||
post_tasks:
|
||||
- name: Cleanup note
|
||||
delegate_to: localhost
|
||||
|
||||
Reference in New Issue
Block a user