12 kwi 2012

Cisco / ssh / linux / bash ... czyli jak szybko i sprawnie zarządzać większą ilością routerów.

Opis sytuacji: 
Gdzieś na ziemi w dziwnych lokalizacjach znajduje się ok 80 routerów cisco 800. Wszystkie skonfigurowane w bardzo podobny sposób "z palca". Brak narzędzia do automatycznego zarządzania. Możliwe jest tylko zarządzanie via Secure Shell.
Cel:
Zautomatyzowanie logowanie do urządzeń  po przez ssh wraz z akceptacją klucza oraz wprowadzania zmian w konfiguracji.


Przez kilka tygodni zastanawiałem się jak to osiągnąć bez zakupu wyspecjalizowanego oprogramowania.
Po długich poszukiwaniach okazało się, iż do moich celów doskonale nadaje się to co mam pod ręką - czyli system Linux z zainstalowanymi dodatkowymi pakietami. Dodatkowo znalazłem pewien skrypt jednak nie spełniał on moich oczekiwań wiec go odrobinę poprawiłem.

Co jest potrzebne:
  • klient ssh ;
  • powłoka GNU Bourne-Again SHell - czyli po prostu bash;
  • interpreter jezyka tcl - czytaj expect.
Co robi skrypt:
Skrypt potrafi połączyć się z urządzeniem, jeśli w pliku know_hosts nie znajdzie klucza publicznego routera to go zaakceptuje. W kroku następnym wyśle hasło, wprowadzi polecenie enable i wprowadzi odpowiednie hasło. Następnie wykona polecenie przekazane jako ostatni parametr i zakończy sesje. W przypadku jeśli jako ostatni parametr podamy spacje ujętą w " "  skrypt pozowoli manualnie wporwadzić dowolną liczbę poleceń.


Skypt wygląda mniej wiecej tak:

#!/usr/bin/expect -f
if {[llength $argv] != 5} {
puts "usage:"
#                       0         1      2       3       4
puts "./ciscoManualConnect  <ip/hostname> <user> <pass> <enpass> <command> "
exit
}


set ip     [lindex $argv 0]
set user   [lindex $argv 1]
set pass   [lindex $argv 2]
set enpass [lindex $argv 3]
set cmd    [lindex $argv 4]
set timeout 10 


log_user 0
spawn ssh ${user}@${ip}
expect "(yes/no)?" {send "yes\n"} \


expect {*Password:*}    {}\
                timeout         {puts  "\nWaiting for login prompt\n" }
send ${pass}\r
expect {*Password:*}    {puts "\nBad password\n"; exit} \
                {*>}            {} \
                timeout         {puts  "\nWaiting for login prompt\n" }


send "enable\r"
expect assword:
send -- ${enpass}\r
expect {*ccess denied}    {puts "\nBad  enable password\n"; exit} \
                {*#}            {} \
                timeout         {timedout waiting for login prompt}


send    ${cmd}
log_user 0
send \r
send exit\r
send exit\r
send exit\r
send exit\r
interact
exit 0

Użycie skryptu:

Zakładając iż powyższy skrypt zapiszemy w pliku ciscoManualConnect i nadamy mu odpowiednie uprawnienia, wywołujemy go w następujący sposób.

./ciscoManualConnect  "$WanIP" "$Login"  "$UsrPwd" "$EnPwd" "$Command"

Dodanie do tego odpowiednio przygotowanej bazy danych (w sumie jedna tabela w MySQL) kilka drobnych funkcji i mamy gotowy automat do wygodnego zarzaądzania dowolną liczbą urządzeń.

Brak komentarzy:

Prześlij komentarz