| aleks_grey ( @ 2010-01-26 09:42:00 |
| Entry tags: | cisco, freebsd, it |
Твой первый скрипт - он первый самый (с)
На самом деле действительно забавно, но до написания скриптов для решения какой-либо задачи на базе ОС FreeBSD дело у меня дошло только сейчас.
Задача была следующей - автоматический backup конфигураций с сетевого оборудования Cisco. Конечно, первыйм делом был опрошен интернет в лице ресурсов типа opennet.ru и им подобных, после чего я пришел к выводу что не хочу писать скрипты, снимающие конфигурации по телнету - хотя бы из-за того, что по моему убеждению скрипт не должен знать-передавать логины и пароли пользователя cisco. Поэтому через некоторое время было решено пойти другим путем - снимать конфигурации по snmp - тем более, что здесь нашлись нужные MIBы с примерами. Единственное что - не знаю как вообще, но, видим из-за другой версии net-snmp, синтаксис у меня отличался.
Естественно на серверной машинке с FreeBSD давно уже крутился стандартный tftp и, ввиду полезности, net-snmp. А вот дальше было интереснее - учитывая отсутствующий опыт в написании скриптов на чем бы то ни было - на cs, bas, perl и т.п. - задача предстояла нетривиальная.
Но делать нечего. Пришлось пойти методом тыка - были привлечены остаточные знания программирования вообще и быстро найденные примеры скриптов на perl. Почему perl? А черт его знает, считайте что интуиция. Причем при этом еще использовалась спецификация языка. В итоге скрипт выглядел следующим образом и, самое главное, работал:
use English; // Разрешаем длинные переменные.
$BCKUP_DIRS = "/opt/backup-conf-cisco/"; // Задаем путь к хранилищу конфигов
$BCKUP_SRC_DIR = "/tftproot/"; // Говорим путь к каталогу TFTP сервера. Поскольку в inetd tftp вкл. без доп парметров, то путь соответствует стандартному.
$tftpserver = '192.168.156.1'; // В принципе далеко не обязательная строчка, но пусть будет.
$MIB = '.1.3.6.1.4.1.9.2.1.55'; // Собственно, сам MIB.
$COMMUNITY = 'secret-rw-community-here'; // А здесь, коммюнити, прописанное на Cisco,
$host_list = '/opt/backup-conf-cisco/host-ios'; // файл со списком цисок, с которых будем бэкапить конфиги.
{файл состоит из строк вида routername::routerip - разделитель подсмотрен в одном из примеров, не вспомню точно в каком.}
system ("mkdir $BACKUP_DIRS/`date +%Y-%m-%d`"); // Создаем каталог наикошернейшего для сортировки их по дате вида YEAR-MONTH-DAY, т.е, например, 2010-01-26.
open DATA, $host_list; //Открываем список цисок и читаем его циклом until not EOF, таким образом опрашивая всех кошачьих по SNMP.
while (<DATA>)
{
chomp;
($name, $ip) = split(/::/); // Делим прочитанную инфу на две переменные - name и ip, вырывая разделитель '::'
system ("touch $BCKUP_SRC_DIR$name"); //Сохдаем файл, в который будет записываться конфигурация циски - его имя равно имени хоста из списка.
system ("chmod 777 $BCKUP_SRC_DIR$name"); // Меняем права на доступ к нему. 777 - конечно жестоко, ну да ладно.
system ("snmpset -v 2c -t 5 -c $RW $ip $MIB.$tftpserver s $name"); // Посылаем на циску SNMP запрос.
system ("cp $BCKUP_SRC_DIR$name $BCKUP_DIRS/`date +%Y-%m-%d`/$name"); //Копируем полученный файл в каталог для бэкапов за сегодняшний проход.
}
close DATA; //Собственно все, закрываем цикл.
Уф. Так о чем это я? А. О том, что имея чуть-чуть настойчивости и умения можно сделать очень многое =)