Fino a ieri funzionava

Se anche tu sei uno a cui piace giocare con i propri dispositivi, testare funzionalità e migliorie, prima o poi scoprirai sai che è importantissimo tenere traccia delle modifiche fatte in configurazione.
Oppure pensa solo a quello che definisco il Cisco classic: quell’ultimo fondamentale wr (write memory) che ti sei dimenticato di lanciare e che ti ha fatto tanto gioire dopo un inaspettato riavvio!
Ecco allora che il versioning, ovvero tenere traccia delle diverse versioni della nostra conf, monitorare le modifiche apportate nel tempo, archiviare e recuperare facilmente le versioni precedenti in caso di necessità è fondamentale.
Se poi questa operazione la puoi anche automatizzare è un bel plus no? Vediamo come…

Creare utente di sola lettura Cisco

Ci servirà un utente per accedere al nostro Cisco che abbia i permessi per eseguire show run e NO, non userai il tuo utente o l’admin di turno.

Seguendo il principio del privilegio minimo, in inglese principle of least privilege (PoLP), useremo un utente dedicato al nostro scopo che abbia solo i privilegi strettamente necessari ovvero sola lettura della configurazione.

Aggiungiamo l’utente readonly_user con privilege level 4 e password readonly_pass

cisco-lab#conf t
cisco-lab(config)#username readonly_user privilege 4 secret readonly_pass

Aggiungiamo quindi i comandi che vogliamo abilitare per il privilege level 4

cisco-lab(config)#privilege exec level 4 show running-config view full

E aggiungiamo l’abilitazione file per il privilege level 4

cisco-lab(config)#file privilege 4

Senza questa, su versioni recenti di IOS, non è possibile leggere il contenuto della flash e della nvram quindi lo show run produrrebbe un output vuoto.

Non ci resta che pianificare l’attività di recupero della configurazione e la sua gestione.
Vediamo due approcci diversi, entrambi personalizzabili in base alle esigenze.

Verifica e Archiviazione automatica con Zabbix

Di Zabbix parliamo spesso e personalmente ne sono un grande fan, quindi se lo stai già utilizzando è ovviamente la scelta più semplice:

  • creiamo un Item di tipo SSH agent
  • gli facciamo eseguire show running-config view full

ed in base a quello che vogliamo ottenere andremo poi a personalizzare lo scheduling, la history ed eventuali Trigger.
Per le mie necessità, ad esempio, ho creato un Template che trovi sul mio GitHub.

L’utilizzo è molto semplice, dopo aver settato le MACRO per l’accesso SSH cisco zabbix ssh archivierà 1 configurazione al giorno e creerà 2 Trigger per questi eventi:

  • configurazione modificata
  • impossibile recuperare dati

Scripting Cisco con Expect

La seconda possibilità di cui parliamo è lo scripting, in particolare con Expect.
Expect è un estensione del linguaggio di scripting Tcl che, citando man, “parla” con terminali interattivi e seguendo uno script sa cosa aspettarsi (expect) da questi e come rispondere.

Possiamo quindi scriptare l’acquisizione della configurazione e integrarla con le nostre necessità di archiviazione:
full su base temporale, diff, git, insomma quello che ti pare… partendo da questo configdump.exp

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/expect -f
 
# Variables
 set hostname [lindex $argv 0]
 set username [lindex $argv 1]
 set password [lindex $argv 2]

# Suppress output
 log_user 0
 
# Disable key check if needed
 spawn ssh -o StrictHostKeyChecking=no $username\@$hostname
 
# Enable SSH timeout notification
 expect {
  timeout { send_user "\nTimeout - Check Device\n"; exit 1 }
  eof { send_user "\nSSH Connection To $hostname Failed\n"; exit 1 }
  "*#" {}
  "*assword:" {
   send "$password\n"
  }
 }
 
 expect "*#"
 send "term len 0\n"
 expect "*#"
 
 match_max 65535
 send "show running-config view full\n"
 expect {
  # look for output beginning with "!" and get til final "end"
  -re "!(.*)\nend(\r?\n|$)" {
   set output $expect_out(0,string)
   send "exit\n"
   expect ":~\$"
   send_user $output
   exit 0
  }
  # exit with error
  default {exit 1}
 }

L’esecuzione è dettagliata nei commenti: si tratta di gestire l’input e l’output interattivo tramite semplici sequenze di expect dei pattern Cisco e send dei comandi necessari.
Per eseguirlo dovremo solo passare i parametri del nostro device per ottenere la configurazione in output con exit status 0 in caso di successo, oppure exit status 1 in caso qualcosa sia andato storto.

1
./configdump.exp CISCO_IP readonly_user readonly_pass

Conclusioni

Fermo restando la necessità di automatizzare un’attività importante, come hai visto le soluzioni proposte sono “aperte” a personalizzazioni anche molto verticali.
L’intento è infatti quello di darti gli input necessari a crearti la tua integrazione che possa essere a misura dei processi esistenti!
Quale userai? E come? Faccelo sapere nei commenti!