В данной статье я хотел бы поделиться своим скриптом для массового изменения конфигурации на маршрутизаторах Cisco ASR и Nokia 7210 SAS
Имеем следующее:
1) Огромное количество маршрутизаторов
2) Linux, в моем случаи Ubuntu.
Для начала установим RANCID:
sudo apt install rancid
Это набор скриптов для подключения к оборудованию.
Создаем папку и кладем в нее скрипт для Cisco:
#!/bin/bash
# Скрипт массового изменения конфигурации
# Первым параметром указывается файл со списком IP адресов устройств
# Вторым параметром указывается файл с командами
# Все данные логируются в папку log текущей директории
PDW=pwd
if [ "$#" -eq 2 ]
then
dos2unix $1
dos2unix $2
rm $PWD/log/*.log
while read line
do
# display $line or do somthing with $line
echo "$line"
/var/lib/rancid/bin/clogin -x $2 $line | tee $PWD/log/$line.log &
#Количество одновременных подключений
[ $( jobs | wc -l ) -ge 4 ] && wait
done < $1
wait
else
echo "Количество аргументов должно быть равно 2-м"
echo "Введенное количество аргуметов $#"
echo "###################################################"
echo "Пример использования: ./cisco.sh list_router conf"
echo "Первый параметр файл с перечнем IP адресов устройств"
echo "Второй параметр файл с перечнем команд"
exit 1
fi
GREP=`egrep -n2 "Invalid input|TIMEOUT|Error|ERROR" $PWD/log/*`
if [ "$?" -eq 0 ]
then
echo " "
echo "!!! Одна или более команд выполнена неудачно !!!"
echo " "
echo "Пожалуйста посмотрите логи в папке log"
echo "Количество ошибок: `egrep "Invalid input|TIMEOUT|Error|ERROR" $PWD/log/* | wc -l`"
echo "Для просмотра логов можно выполнить команду: egrep -n2 \"Invalid input|TIMEOUT|Error|ERROR\" $PWD/log/*"
echo " "
exit 0
fi
echo " "
echo "#####################################"
echo "!!! Все команды выполнены успешно !!!"
echo "#####################################"
echo " "
exit 0
ля работы скрипта понадобится 2 файла
1) файл со списком всех IP адресов маршрутизаторов
10.113.64.27
10.113.64.28
10.113.64.29
2) файл со списком команд, которые нужно ввести на маршрутизаторе
sh int des
sh ver
sh cpu history
Теперь когда файлы готовы, нам нужно настроить утилиту RANCID, рассказать ей какой логин, какой пароль, есть ли пароль у привилигированного режима или используется такакс и так далее. Для этого нам нужно создать файл в домашней директории пользователя с названием :
.cloginrc
Затем обязательно изменить ему права, так что бы читать и писать в этот файл мог только наш пользователь. Ну мы же не хотим, что бы пароль от маршрутизаторов мог узнать любой дурачек, поэтому делаем:
chmod 600 .cloginrc
Должно получиться вот так:
ll /home/baf/.cloginrc
-rwx------ 1 baf baf 188 Aug 22 22:23 /home/baf/.cloginrc*
Теперь в этот файл добавляем примерно такую конфигурацию:
add password * {passwd} {passwd}
add user * {user}
add userpassword * {passwd}
add method * {ssh}
add noenable * {1}
add autoenable * {1}
add prompt * {^[^# ]+[#>]}
тут все просто, пароль от привилегированного режима, логин, пароль, тип подключения ssh и отключение не нужных операций, так как в моем случаи за привилегиями следит такакс. Более подробно про конфигурацию данного файла можно почитать в мане и поверьте там много интересного:
man cloginrc
Теперь в папке со скриптом создайте каталог с именем log. Сюда будет записываться все что делает скрипт на оборудовании. Это важно для проверки того, что мы наделали в случаи проблем или наоборот для понимания, что все хорошо.
А для этого я добавил в скрипт проверку на то были ли ошибки в процессе ввода команд на маршрутизаторах.
Все что нам нужно теперь это запустить наш скрипт:
./cisco.sh routers.txt comands.txt
И можно идти пить чай, по окончанию если все хорошо мы должны увидеть следующее:
#####################################
!!! Все команды выполнены успешно !!!
#####################################
Если этого не произошло, то скрипт скажет что нужно делать и где.
И я чуть не забыл про Nokia. Все дело в том, что у этих маршрутизаторов приглашение на ввод пароля и команд, а так же выход из маршрутизатора сильно отличаются от Cisco и поэтому я немного изменил скрипт для этих маршрутизаторов:
#!/bin/bash
# Скрипт массового изменения конфигурации
# Первым параметром указывается файл со списком IP адресов устройств
# Вторым параметром указывается файл с командами
# Все данные логируются в папку log текущей директории
PDW=pwd
if [ "$#" -eq 2 ]
then
dos2unix $1
dos2unix $2
rm $PWD/log/*.log
while read line
do
# display $line or do somthing with $line
echo "$line"
/var/lib/rancid/bin/noklogin2 -x $2 $line | tee $PWD/log/$line.log &
#Количество одновременных подключений
[ $( jobs | wc -l ) -ge 4 ] && wait
done < $1
wait
else
echo "Количество аргументов должно быть равно 2-м"
echo "Введенное количество аргуметов $#"
echo "###################################################"
echo "Пример использования: ./cisco.sh list_router conf"
echo "Первый параметр файл с перечнем IP адресов устройств"
echo "Второй параметр файл с перечнем команд"
exit 1
fi
GREP=`egrep -n2 "Error" $PWD/log/*`
if [ "$?" -eq 0 ]
then
echo " "
echo "!!! Одна или более команд выполнена неудачно !!!"
echo " "
echo "Пожалуйста посмотрите логи в папке log"
echo "Количество ошибок: `egrep "Error" $PWD/log/* | wc -l`"
echo "Для просмотра логов можно выполнить команду: egrep -n2 \"Error\" $PWD/log/*"
echo " "
exit 0
fi
echo " "
echo "#####################################"
echo "!!! Все команды выполнены успешно !!!"
echo "#####################################"
echo " "
exit 0
По большому счету отличие у них парочка, самое главное это какой утилитой мы подключаемся к узлу. Для Cisco это clogin для Nokia это noklogin. Весьма понятно не правда ли? ))))
Но у Nokia не так все просто. Нужно навести марофет, что бы все работало как надо. Для этого из файла /var/lib/rancid/bin/noklogin нужно удалить следующие строки кода:
send "//environment no more\r"
expect {
-re "MINOR: CLI Command not allowed" {
send_error "Error: //environment no more command is not allowed\n"
incr exitval
continue
}
-re $prompt {}
}
send "environment more false\r"
expect {
-re "MINOR: CLI Command not allowed" {
send_error "Error: environment more false command is not allowed\n"
incr exitval
continue
}
-re $prompt {}
}
Теперь скрипт будет работать как часы вместо вас, пока вы крепко спите.
На этом у меня все, желаю всем удачи и дачу у моря.