Понадобилось как-то на работе организовать бэкап конфигов с свитчей и прочего сетевого оборудования, так чтобы делался он автоматически и с отправкой архива с конфигами на почту.
Варианты с использованием Kiwi Tools я отмел, ибо неудобно мне, решил поковырять Linux))
Остановился на простом варианте запуска по расписанию скрипта, который будет подключаться к свитчам по ssh или telnet, далее по команде копировать текущий конфиг на tftp-сервер, а оттуда уже отправлять его на почту.
Несмотря на то что есть несколько Linux-серверов, я решил взять для работы NAS WD MyCloud, который у нас используется как файловая помойка. Вот такой:
Замечателен он тем что в этой маленькой коробочке стоит неплохой процессор, Marvell Armada 375 (2x1GHz) или Mindspeed Comcerto C2200 (2x650MHz), в зависимости от ревизии, и объем ОЗУ 512MB Ram или 256 MB Ram, в зависимости от ревизии.
К примеру у нас GEN2, который имеет более быстрый процессор и больше ОЗУ.
И там внутри Linux, пусть и урезанный, но Linux. И есть в сети руководства как накатить туда полноценный Linux, например Debian, а далее что душа пожелает.
Я в свое время почитал эту тему на 4PDA и поставил туда Debian, а потом и OpenMediaVault.
Но вы можете использовать любой другой компьютер/устройство на Linux.
Суть сводится к тому что нужно доставить пару пакетов:
expect и tcl - для обработки команд свитчей, и mpak для отправки вложения на почту.
Также необходимо поставить tftp-сервер, к примеру в OpenMediaVault это делается в пару кликов.
Итак, мы их поставили, далее пишем скрипт backup_cisco.sh, с таким содержанием:
#!/bin/bash
#!/usr/bin/expect -f
expect -c 'spawn telnet 192.168.254.10;
expect "sername: "
send "admin\r"
expect "assword: "
send "P@$$W0Rd\r"
expect ">"
send "enable\r"
expect "assword: "
send "P@$$W0Rd\r"
expect "#"
send "copy running-config tftp://192.168.32.243/CME.cfg\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn telnet 192.168.32.254;
expect "sername: ";
send "admin\r";
expect "assword: ";
send "P@$$W0Rd\r";
expect "#";
send "copy running-config tftp://192.168.32.243/Core.cfg\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn telnet 192.168.32.3;
expect "sername: ";
send "admin\r";
expect "assword: ";
send "P@$$W0Rd\r";
expect "#";
send "copy running-config tftp://192.168.32.243/SW_2.cfg\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn telnet 192.168.32.4;
expect "sername: ";
send "admin\r";
expect "assword: ";
send "P@$$W0Rd\r";
expect "#";
send "copy running-config tftp://192.168.32.243/SW_3.cfg\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn telnet 192.168.32.5;
expect "sername: ";
send "admin\r";
expect "assword: ";
send "P@$$W0Rd\r";
expect "#";
send "copy running-config tftp://192.168.32.243/Cisco_4948.cfg\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn ssh admin@192.168.254.11;
expect "assword: ";
send "P@$$W0Rd\r";
expect ">";
send "enable\r";
expect "assword:";
send "P@$$W0Rd\r";
expect "#";
send "copy running-config tftp://192.168.32.243/ASA.cfg\r\r\r\r";
expect "#";
send "exit\r"'
expect -c 'spawn ssh 192.168.3.5;
expect "ser: ";
send "admin\r";
expect "assword: ";
send "P@$$W0Rd\r";
expect ">";
send "transfer upload datatype config\r";
expect ">";
send "transfer upload serverip 192.168.32.243\r";
expect ">";
send "transfer upload filename WiFi.cfg\r";
expect ">";
send "transfer upload start\r";
expect "(y/N)";
send "y\r";
expect ">";
send "logo\r";
expect "(y/N)";
send "y\r'
sleep 4m
mv /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/tftproot/*.cfg /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/
cd /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/
tar -czf backup_cisco_`date +"%m-%d-%Y"`.tar.gz /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/*.cfg
mpack -s "CISCO Backup WD" /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/backup_cisco_`date +"%m-%d-%Y"`.tar.gz admin@krg.corpname.kz
rm -rf /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/*.cfg
Что делает скрипт:
1. Подключается к свитчу.
expect -c 'spawn telnet 192.168.254.10;
2. Авторизуется
expect "sername: "
send "admin\r"
expect "assword: "
send "P@$$W0Rd\r"
3. Переходит в привилегированный режим
expect ">"
send "enable\r"
expect "assword: "
send "P@$$W0Rd\r"
4. Передает команду копирования текущего конфига на tftp сервер.
expect "#"
send "copy running-config tftp://192.168.32.243/CME.cfg\r\r\r";
5. Отключается от свитча и переходит к следующему.
expect "#";
send "exit\r"'
За обработку ответа от свитча в скрипте отвечает как раз тот самый expect
Все свитчи разные, поэтому команды передачи конфига тоже разные.
Последние команды:
6. Пауза в 4 минуты чтобы убедиться что все конфиги слились.
sleep 4m
7. Перемещает все файлы с расширением *.cfg в отдельный каталог.
mv /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/tftproot/*.cfg /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/
8. Переход в каталог с скопированными конфигами.
cd /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/
9. Архивация всех файлов с расширением *.cfg в архив с текущей датой в имени
tar -czf backup_cisco_`date +"%m-%d-%Y"`.tar.gz /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/*.cfg
10. Отправка файла вложением на почту админу на admin@krg.corpname.kz
mpack -s "CISCO Backup WD" /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/backup_cisco_`date +"%m-%d-%Y"`.tar.gz admin@krg.corpname.kz
11. Удаляет все конфиги, очищает папку:
rm -rf /srv/dev-disk-by-id-ata-WDC_WD30EFRX-68EUZN0_WD-WCC4N6EATLHD-part2/backups/cisco/*.cfg
Далее, в веб-интерфейсе OpenMediaVault настраиваем уведомления для работы с почтой, у нас почта идет через MS Office 365:
Далее добавляем скрипт в встроенный планировщик OpenMediaVault, к примеру у меня он срабатывает в 8.00 по пятницам:
Следующий пост будет про мониторинг оборудования через Zabbix с оповещением в Telegram