Filöverföring över SCP
Jag brottades med att få filöverföring över SCP att fungera i Ansible med de inbyggda modulerna till Cisco-routrar. Det funkade inte.
Det som till slut fungerade var att slå Linux-kommandon med ansible.builtin.command.
- name: Kopiera image från lokal maskin till routern via SCP
ansible.builtin.command:
cmd: sshpass -p "{{ ansible_ssh_pass }}" scp -O -o StrictHostKeyChecking=no {{ image_src_path }} {{ ansible_user }}@{{ inventory_hostname }}:{{ image_dest_path }}
delegate_to: localhost
when: image_file not in dir_out.stdout[0]
sshpass -p används här för att ta lösenordet man matar in när man kör jobbet med flaggan -k, men man kan köra utan och manuellt slå lösenord varje gång jobbet sker.
Här är ett filöverföringsjobb för att ladda över IOS-XE mjukvara och NBAR-fil:
---
- name: Ladda upp IOS-XE mjukvara till routrar
hosts: all
gather_facts: no
vars:
image_file: "cat9k_iosxe.17.12.06.SPA.bin"
image_src_path: "/data/dir/c9300-c9500/17.12.6/{{ image_file }}"
image_dest_path: "bootflash:{{ image_file }}"
ansible_command_timeout: 7200 # 2 timmar
nbar_file: "pp-adv-cat9k-1712.1-49-74.0.0.pack"
nbar_src_path: "/data/dir/c9300-c9500/17.12.6/{{ nbar_file }}"
nbar_dest_path: "bootflash:{{ nbar_file }}"
tasks:
- name: Print paths
ansible.builtin.debug:
msg:
- "image_src_path: {{ image_src_path }}"
- "image_dest_path: {{ image_dest_path }}"
- name: Kontrollera om IOS-XE image redan finns
cisco.ios.ios_command:
commands:
- "dir bootflash: | include {{ image_file }}"
register: dir_out
- name: Ta bort oanvända IOS-XE filer (install remove inactive)
ansible.netcommon.cli_command:
command: "install remove inactive"
prompt: "Do you want to remove the above files\\? \\[y/n\\]"
answer: "y"
when: image_file not in dir_out.stdout[0]
- name: Kopiera IOS-XE image från lokal maskin till routern via SCP
ansible.builtin.command:
cmd: sshpass -p "{{ ansible_ssh_pass }}" scp -O -o StrictHostKeyChecking=no {{ image_src_path }} {{ ansible_user }}@{{ inventory_hostname }}:{{ image_dest_path }}
delegate_to: localhost
when: image_file not in dir_out.stdout[0]
- name: Verifiera att filen finns på routern
cisco.ios.ios_command:
commands:
- "dir bootflash: | include {{ image_file }}"
register: verify_dir
failed_when: image_file not in verify_dir.stdout[0]
- name: Kontrollera om NBAR-filen redan finns på routern
cisco.ios.ios_command:
commands:
- "dir bootflash: | include {{ nbar_file }}"
register: dir_out_nbar
- name: Kopiera NBAR-fil från lokal maskin till routern via SCP
ansible.builtin.command:
cmd: sshpass -p "{{ ansible_ssh_pass }}" scp -O -o StrictHostKeyChecking=no {{ nbar_src_path }} {{ ansible_user }}@{{ inventory_hostname }}:{{ nbar_dest_path }}
delegate_to: localhost
when: dir_out_nbar.stdout[0] is search(nbar_file) == False
- name: Verifiera att NBAR-filen finns på routern
cisco.ios.ios_command:
commands:
- "dir bootflash: | include {{ nbar_file }}"
register: verify_dir_nbar
failed_when: verify_dir_nbar.stdout[0] is search(nbar_file) == False