Skip to main content

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