SCI-Network a Magyarországi Cisco Techtorialon – 2024

cisco-techtorial-2024

SCI-Network a Magyarországi Cisco Techtorialon – 2024

Idén is részt vettünk a Magyarországi Cisco Techtorial rendezvényen, amelyet az Etele Plázában tartottak meg. Az esemény ismét kiváló lehetőséget adott számunkra, hogy bemutassuk, hogyan segíthet az Ansible a Cisco hálózati platformokon történő automatizációban.

Előadásunk: Konfig-guru Ansible-lel
Az előadásunkban bemutattuk, hogyan használható az Ansible a konfigurációs feladatok automatizálására, például Cisco eszközök frissítésére, konfigurációmentésre és hibajavításra. Az Ansible könnyen olvasható YAML playbook-okkal dolgozik, ügynöknélküli működést tesz lehetővé, és idempotens, ami azt jelenti, hogy csak a szükséges változtatásokat hajtja végre. Mindez jelentősen leegyszerűsíti a hálózati adminisztrációt és csökkenti az emberi hibák számát.

Az előadást élő demóval tettük még izgalmasabbá, ahol példákat mutattunk az IOS frissítésre, konfigurációmentésre és normalizálásra. Emellett bemutattuk a Red Hat Ansible Automation Platform előnyeit, amely egy átfogó megoldást kínál az automatizációs feladatok központosított kezelésére.

Közösségi jelenlét és kapcsolatok építése
Az esemény során az SCI-Network mérnökei és értékesítői szívesen válaszoltak az érdeklődők kérdéseire, legyen szó hálózati megoldásokról vagy az automatizáció lehetőségeiről.

Tekintse meg előadásunk anyagát PDF formátumban, és fedezze fel a három élő demó YAML kódját, amelyek bemutatják az Ansible erejét a hálózati automatizációban:
Konfig-guru ansibelel- Czifra János

Demo1: Copy IOS from TFTP to device and verify:

---
- name: Update Cisco devices from TFTP
  hosts: demo1
  gather_facts: false
  tasks:
    - name: Check device type
      ios_command:
        commands:
          - "show inventory"
      register: inventory_output
      become: true

    - name: Determine firmware file based on device type
      set_fact:
         firmware_file: "{{ 'cat9k_iosxe.17.09.05.SPA.bin' if '9300' in inventory_output.stdout | join(' ') else 'cat3k_caa-universalk9.16.12.11.SPA.bin' }}"
         target_image_size: "{{ '1258131142' if '9300' in inventory_output.stdout | join(' ') else '482611915' }}"
         expected_md5: "{{ '5ca91b99bee3591fd75c17274ab26d1a' if '9300' in inventory_output.stdout | join(' ') else '035288e3dbe7a59760502907cad67142' }}"
         #['Destination filename [cat9k_iosxe.17.09.05.SPA.bin]? \nAccessing tftp://10.168.83.3/cat9k_iosxe.17.09.05.SPA.bin...\n
         #Loading cat9k_iosxe.17.09.05.SPA.bin from 10.168.83.3 (via GigabitEthernet0/0): !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
         #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n[OK - 1258131142 bytes]\n\n1258131142 bytes copied in 95.676 secs (13149914 bytes/sec)']

    - name: Initiate file download from TFTP server
      ios_command:
        commands:
          - command: "copy tftp://{{ tftp_server }}/{{ firmware_file }} flash:{{ firmware_file }}"
            check_all: True
            prompt: 
               - "[confirm]"
            answer: 
               - ''
        wait_for:
           - result[0] contains {{ target_image_size }} bytes copied
      register: download_result
      become: true

    - name: Verify MD5 checksum
      ios_command:
        commands:
          - "verify /md5 flash:{{ firmware_file }}"
      register: md5_check_result
      ignore_errors: true
      become: true
    
    - name: Extract actual MD5 checksum from output
      set_fact:
        md5_actual: "{{ md5_check_result.stdout_lines | select('search', '=') | list | first | regex_search('= (\\w+)', '\\1') | trim }}"
        #verify /md5 flash:cat9k_iosxe.17.09.05.SPA.bin
        #..................................
        #..................................
        #..................................
        #..................................
        #...............................Done!
        #verify /md5 (flash:c7200-js-mz) = 5ca91b99bee3591fd75c17274ab26d1a

    - name: Convert md5_actual to string
      set_fact:
        md5_actual_str: "{{ md5_actual[0] if md5_actual is iterable else md5_actual }}"

    - name: Debug - Print actual MD5 checksum
      debug:
        msg: "Actual MD5 checksum: {{ md5_actual_str }}\nExpected MD5 checksum: {{ expected_md5 }}"

    - name: Validate MD5 checksum
      fail:
        msg: "MD5 checksum does not match! Expected: {{ expected_md5 }}, Got: {{ md5_actual_str }}"
      when: expected_md5 != md5_actual_str
      ignore_errors: true
    
    - name: Set boot firmware
      ios_config:
        lines:
          - "no boot system"
          - "boot system flash:{{ firmware_file }}"
        save_when: always
      when: expected_md5 == md5_actual_str
      become: true

Demo2: Copy IOS information: running, interface and etc to file and make backup.

---
- name: Demo 2 Config and status
  hosts: demo2
  gather_facts: false

  tasks:
  
    - name: Backup
      ios_command: 
         commands: 
          - show run
          - show interface stats
          - show spanning-tree sum
          - show vlan brief
          - show interface
          - show ip route
          - show version
          - show inventory
      register: output
      
    - name: Save Config
      copy:
        content: "{{ output.stdout | join('\n') }}"
        #content: "{{ output.stdout[0] }} "
        dest: "/ansible/backup/{{ inventory_hostname }}.txt"

Demo3: Normalization in configuration

---

- name: Apply Standard Configuration to Cisco Devices
  hosts: demo3
  gather_facts: false
  connection: network_cli

  tasks:

    - name: remove vty
      cisco.ios.ios_config:
        parents: "line vty 0 15"
        lines:
          - no access-class acl_netmanagement in vrf-also
          - exec-timeout 30 0
          - logging synchronous
          - transport input ssh

    - name: adding acl_netmanagement
      cisco.ios.ios_config:
        parents: "ip access-list extended acl_netmanagement"
        lines:
          - 10 permit tcp host 192.168.10.10 any eq 22
          - 20 permit tcp host 192.168.10.16 any eq 22
          - 30 permit tcp host 192.168.10.22 any eq 22
          - 40 permit tcp host 192.168.10.36 any eq 22
          - 50 permit tcp host 192.168.10.40 any eq 22
          - 60 permit tcp 192.168.56.0 0.0.0.255 any eq 22
          - 70 permit tcp 10.168.83.0 0.0.0.255 any eq 22
        before:
          - no ip access-list extended acl_netmanagement
          
    - name: remove logging and acl
      cisco.ios.ios_config:
        after:
          - no logging host 192.168.11.100
          - no logging host 172.28.2.10
          - no ip access-list standard 90
          - no access-list 40
          - no access-list 41
          - no access-list 91 
          - no access-list 92
      ignore_errors: true
          
    - name: basesnmpandstuff
      ignore_errors: true
      cisco.ios.ios_config:
        lines:
          - cdp run
          - ip domain-name techtorial.cisco.hu
          - ip domain name techtorial.cisco.hu
          - access-list 90 permit 192.168.100.10
          - access-list 90 permit 192.168.100.16
          - access-list 90 permit 192.168.100.41
          - access-list 90 permit 192.168.100.42
          - access-list 90 permit 192.168.101.52
          - access-list 90 permit 192.168.100.62
          - access-list 90 permit 192.168.120.142
          - access-list 40 permit host 192.168.100.40
          - access-list 41 permit host 192.168.20.132
          - snmp-server group admin-group v3 priv write v3default
          - snmp-server view v3default iso included
          - snmp-server view v3default iso included
          - snmp-server view NO_HIGH_CPU iso included
          - snmp-server group readonly-group v3 priv read v3default 
          - snmp ifmib ifindex persist
          - snmp-server host 192.168.100.40 primeinfra
          - snmp-server host 192.168.20.132 version 3 priv dnacenter
          - snmp-server host 192.168.100.62 zabbix
          - logging host 192.168.120.40
          - logging host 192.168.120.31
          - logging host 192.168.121.31
          - logging host 192.168.124.21
          - logging host 192.168.20.132
        after:
          - "snmp-server user dnacenter admin-group v3 auth sha verytitkos priv aes 128 megtitkosabb access 41"
          - snmp-server community a8w7dhiawhd view NO_HIGH_CPU RO 90
          - snmp-server community UIh7GhiHH view NO_HIGH_CPU RO 90
          - snmp-server community iuhiuh8w8h view NO_HIGH_CPU RO 90
          - no snmp-server community iuhaw9hh RO 50


    - name: adding vty
      cisco.ios.ios_config:
        parents: "line vty 0 15"
        lines:
          - access-class acl_netmanagement in vrf-also
          - exec-timeout 30 0
          - logging synchronous
          - transport input ssh          
          
      notify: save configuration

  handlers:
     - name: save configuration
       ios_command:
         commands: "write mem"

1439 972 SCI Network