Автоматическое резервное копирование конфигураций Cisco

Однажды перед каждым системным администратором, работающим с коммутаторами Cisco, встает вопрос упрощения резервного копирования конфигураций этих устройств. Копировать вручную, в принципе, тоже можно, но когда количество коммутаторов переваливает за десяток (у меня их 40) ручное резервное копирование начинает давать сбои 🙂

Я решил, что значительно удобнее было бы иметь скрипт, который автоматически проходит по всем коммутаторам Cisco и сохраняет их конфигурации. Причем, сохраняет только в том случае, если конфигурация отличается от конфигурации, сохраненной в предыдущий раз, или это первое сохранение.

Для реализации задуманного необходимо на linux-сервере, который будет выполнять резервное копирование конфигураций коммутаторов, установить:

  1. TFTP-сервис (я использую atftp).
  2. Интерпретатор Expect.

Авторизация на коммутаторах Cisco у меня происходит через сервис TACACS+, поэтому для выполнения резервного копирования я добавил на сервере TACACS+ учетную запись backup.

Так как не все коммутаторы Cisco поддерживают SSH (зависит от версии iOS, иногда нет смысла/возможности/желания обновлять), я написал два сценария резервного копирования на языке Expect: ssh- и telnet-версии. Все скрипты, участвующие в резервном копировании коммутаторов, я расположил в директории /home/backup.

Версия для SSH, имя файла скрипта — cisco_inc1:

#!/usr/bin/expect

# Получение аргументов командной строки
# IP-адрес коммутатора
set ciscoip [lindex $argv 0];
# Имя коммутатора
set cisconame [lindex $argv 1];

set username "backup"
set password "password"
set tftpserver "10.10.10.10"

spawn ssh $username@$ciscoip

# Авторизация
expect -nocase "password: ";
send "$password\r";

# Создание резервной копии
expect "*#";
send "copy running-config tftp://$tftpserver/$cisconame\r";

expect "*\?";
send "\r";
expect "*\?";
send "\r";

expect "*#";
send "exit\r";

interact

 

Версия для Telnet, имя файла скрипта — cisco_inc2:

#!/usr/bin/expect

# Получение аргументов командной строки
# IP-адрес коммутатора
set ciscoip [lindex $argv 0];
# Имя коммутатора
set cisconame [lindex $argv 1];

set username "backup"
set password "password"
set tftpserver "10.10.10.10"

spawn telnet $ciscoip

# Авторизация
expect -nocase "username: ";
send "$username\r";
expect -nocase "password: ";
send "$password\r";

# Создание резервной копии
expect "*#";
send "copy running-config tftp://$tftpserver/$cisconame\r";

expect "*\?";
send "\r";
expect "*\?";
send "\r";

expect "*#";
send "exit\r";

interact
css.php