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"