Dlink Empty Script: различия между версиями
Sirmax (обсуждение | вклад) (Новая: =Настройка большого числа коммутаторов= ==Выбор средств== ==Краткое описание скриптов==) |
Sirmax (обсуждение | вклад) |
||
(не показано 11 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
+ | [[Категория:Linux]] |
||
+ | [[Категория:ShellScripting]] |
||
+ | [[Категория:Switch]] |
||
+ | [[Категория:DlinkSwitch]] |
||
+ | |||
=Настройка большого числа коммутаторов= |
=Настройка большого числа коммутаторов= |
||
+ | В связи с тем, что было принято решение делать еже(дневно|недельно|годично) бекапы коммутаторов, возникла необходимость каким-то образом прописать на них коммюнити. |
||
+ | Обходить руками все коммутаторы не хотелось. |
||
+ | Задача усложнялась тем, что часть коммутаторов уже использовали централизованную авторизацию через радиус, а часть - старую схему с авторизацией из локальной базы пользователей. |
||
==Выбор средств== |
==Выбор средств== |
||
+ | Существует 2 хорошо известных программы для решения данной задачи |
||
+ | *expect |
||
+ | *empty (http://sourceforge.net/projects/empty) |
||
+ | |||
+ | Т.к. expect был у меня не собран, и предлогал поставить множество зависимостей, я решил использовать empty. |
||
+ | Тем более, что написание скриптов на bash с использованием empty мне показалось значительно проще. |
||
+ | |||
==Краткое описание скриптов== |
==Краткое описание скриптов== |
||
+ | Для того что бы пройтись по всем коммутаторам и внести на них изменения, я написал следующий скрипт: (разбито на части для лучшего понимания) |
||
+ | ===Описание переменных=== |
||
+ | <PRE> |
||
+ | #!/bin/bash |
||
+ | |||
+ | PWGEN=`which pwgen` |
||
+ | EMPTY=`which empty` |
||
+ | LOG_FILE="/var/log/des_empty.log" |
||
+ | SQL_LOG="/var/log/des_sql.log" |
||
+ | |||
+ | |||
+ | USERNAME_RADIUS='radiususer' |
||
+ | PASSWORD_RADIUS='password_in_radius' |
||
+ | USERNAME_LOCAL='local_user' |
||
+ | PASSWORD_LOCAL='local_password' |
||
+ | PASSWORD_ENABLE='enable_password' |
||
+ | IP_LIST='ip_list' |
||
+ | </PRE> |
||
+ | Есть 2 пользователя (из радиуса и локальный) с которыми можно авторизоваться на коммутаторе.В случае локальной авотризации сразу попадаешь в привилигированный режим. |
||
+ | В случае авторизации через радиус требуется дополнительно выполнить комманду |
||
+ | <PRE> |
||
+ | enable admin |
||
+ | </PRE> |
||
+ | ===Полезная работа=== |
||
+ | Собственно полезную работу вынесу в отдельную ф-ю - то, что нужно сделать с коммутатором после авторизации. |
||
+ | Тут может быть что угодно, я оставил для пример добавления случайной RW коммюнити.. |
||
+ | 30-секундная пауза что бы коммутатор успел сохранить настройки. |
||
+ | |||
+ | Возможно, следует проверять успешность сохранения, но в моей практике сбоев на этом этапе не было. |
||
+ | |||
+ | <PRE> |
||
+ | function load_data |
||
+ | { |
||
+ | RW_COMMUNITY=`$PWGEN -1` |
||
+ | echo 'create snmp view ALL 1 view_type included' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO |
||
+ | echo 'create snmp community '$RW_COMMUNITY' view ALL read_write' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO |
||
+ | echo UPDATE switch set rw_community=\"$RW_COMMUNITY\", is_backup=1 where ip=\"$IP\" >> $SQL_LOG |
||
+ | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'save\n' |
||
+ | sleep 30 |
||
+ | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'logout\n' |
||
+ | } |
||
+ | </PRE> |
||
+ | |||
+ | |||
+ | ===Авторизация на коммутаторе=== |
||
+ | Наиболее запутанная часть - авторизация на коммутаторе. |
||
+ | |||
+ | |||
+ | Для каждого IP: если коммутатор выдает строку UserName то использовать имя пользователя и логин для авторизации через радиус, в простивно случае передавть 2 раза \n что бы произвести вторую проверку. Если свитч выдает строку username - то использовать локальные имя пользователя и пароль. |
||
+ | |||
+ | <PRE> |
||
+ | for IP in `cat $IP_LIST` |
||
+ | do |
||
+ | echo $IP |
||
+ | IN_FIFO=/tmp/${IP}_in.fifo |
||
+ | OUT_FIFO=/tmp/${IP}_out_fifo |
||
+ | if ping -c 1 $IP -W1 2>&1 >/dev/null |
||
+ | then |
||
+ | # Создать соединение с коммутатором |
||
+ | $EMPTY -f -i $IN_FIFO -o $OUT_FIFO -L /var/log/empty_log telnet $IP |
||
+ | # Нужно различать свитчи которые авторизуют через радиус ( у них пригдашение UserName: , PassWord: и свитчи которые авторизуют локально - у них приглашение username: password: |
||
+ | # |
||
+ | $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO serName: "${USERNAME_RADIUS}\n" |
||
+ | # Проверить код возврата, если успешно ( найдено ОДНО совпадение! )- передать пароль. |
||
+ | if [ $? = 1 ] |
||
+ | then |
||
+ | sleep 1 |
||
+ | echo "Use Radius Auth for "$IP |
||
+ | $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_RADIUS}\n" |
||
+ | $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" |
||
+ | $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "enable admin\n" |
||
+ | $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_ENABLE}\n" |
||
+ | sleep 1 |
||
+ | load_data; |
||
+ | else |
||
+ | $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" |
||
+ | sleep 1 |
||
+ | $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" |
||
+ | sleep 1 |
||
+ | echo "Use local Auth for " $IP |
||
+ | $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO sername: "${USERNAME_LOCAL}\n" |
||
+ | if [ $? = 1 ] |
||
+ | then |
||
+ | $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assword: "${PASSWORD_LOCAL}\n" |
||
+ | sleep 1 |
||
+ | load_data; |
||
+ | else |
||
+ | echo "Unknown error or device." $IP" This error will be writen to log" >> $LOG_FILE |
||
+ | echo "Unknown error or device." $IP" This error will be writen to log $LOG_FILE" |
||
+ | fi |
||
+ | fi |
||
+ | else |
||
+ | echo "Device is unreacheble (?)" |
||
+ | fi |
||
+ | done |
||
+ | </PRE> |
||
+ | |||
+ | ===Тонкости (мой частный случай)=== |
||
+ | Можно брать список IP напрямую из SQL но я решил этого не делать - это единоразовая операция, или по крайне мере редкая. |
||
+ | Соответвенно, результат я пишу в sql-файлик, для того что бы сохранить коммюнити и использовать их потом для бекапа конфиолв. |
Текущая версия на 15:13, 5 мая 2020
Настройка большого числа коммутаторов
В связи с тем, что было принято решение делать еже(дневно|недельно|годично) бекапы коммутаторов, возникла необходимость каким-то образом прописать на них коммюнити. Обходить руками все коммутаторы не хотелось. Задача усложнялась тем, что часть коммутаторов уже использовали централизованную авторизацию через радиус, а часть - старую схему с авторизацией из локальной базы пользователей.
Выбор средств
Существует 2 хорошо известных программы для решения данной задачи
- expect
- empty (http://sourceforge.net/projects/empty)
Т.к. expect был у меня не собран, и предлогал поставить множество зависимостей, я решил использовать empty. Тем более, что написание скриптов на bash с использованием empty мне показалось значительно проще.
Краткое описание скриптов
Для того что бы пройтись по всем коммутаторам и внести на них изменения, я написал следующий скрипт: (разбито на части для лучшего понимания)
Описание переменных
#!/bin/bash PWGEN=`which pwgen` EMPTY=`which empty` LOG_FILE="/var/log/des_empty.log" SQL_LOG="/var/log/des_sql.log" USERNAME_RADIUS='radiususer' PASSWORD_RADIUS='password_in_radius' USERNAME_LOCAL='local_user' PASSWORD_LOCAL='local_password' PASSWORD_ENABLE='enable_password' IP_LIST='ip_list'
Есть 2 пользователя (из радиуса и локальный) с которыми можно авторизоваться на коммутаторе.В случае локальной авотризации сразу попадаешь в привилигированный режим. В случае авторизации через радиус требуется дополнительно выполнить комманду
enable admin
Полезная работа
Собственно полезную работу вынесу в отдельную ф-ю - то, что нужно сделать с коммутатором после авторизации. Тут может быть что угодно, я оставил для пример добавления случайной RW коммюнити.. 30-секундная пауза что бы коммутатор успел сохранить настройки.
Возможно, следует проверять успешность сохранения, но в моей практике сбоев на этом этапе не было.
function load_data { RW_COMMUNITY=`$PWGEN -1` echo 'create snmp view ALL 1 view_type included' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO echo 'create snmp community '$RW_COMMUNITY' view ALL read_write' | $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO echo UPDATE switch set rw_community=\"$RW_COMMUNITY\", is_backup=1 where ip=\"$IP\" >> $SQL_LOG $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'save\n' sleep 30 $EMPTY -v -s -i $OUT_FIFO -o $IN_FIFO -t 5 'logout\n' }
Авторизация на коммутаторе
Наиболее запутанная часть - авторизация на коммутаторе.
Для каждого IP: если коммутатор выдает строку UserName то использовать имя пользователя и логин для авторизации через радиус, в простивно случае передавть 2 раза \n что бы произвести вторую проверку. Если свитч выдает строку username - то использовать локальные имя пользователя и пароль.
for IP in `cat $IP_LIST` do echo $IP IN_FIFO=/tmp/${IP}_in.fifo OUT_FIFO=/tmp/${IP}_out_fifo if ping -c 1 $IP -W1 2>&1 >/dev/null then # Создать соединение с коммутатором $EMPTY -f -i $IN_FIFO -o $OUT_FIFO -L /var/log/empty_log telnet $IP # Нужно различать свитчи которые авторизуют через радиус ( у них пригдашение UserName: , PassWord: и свитчи которые авторизуют локально - у них приглашение username: password: # $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO serName: "${USERNAME_RADIUS}\n" # Проверить код возврата, если успешно ( найдено ОДНО совпадение! )- передать пароль. if [ $? = 1 ] then sleep 1 echo "Use Radius Auth for "$IP $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_RADIUS}\n" $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "enable admin\n" $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assWord: "${PASSWORD_ENABLE}\n" sleep 1 load_data; else $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" sleep 1 $EMPTY -t 2 -s -o $IN_FIFO -i $OUT_FIFO "\n" sleep 1 echo "Use local Auth for " $IP $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO sername: "${USERNAME_LOCAL}\n" if [ $? = 1 ] then $EMPTY -t 2 -w -o $IN_FIFO -i $OUT_FIFO assword: "${PASSWORD_LOCAL}\n" sleep 1 load_data; else echo "Unknown error or device." $IP" This error will be writen to log" >> $LOG_FILE echo "Unknown error or device." $IP" This error will be writen to log $LOG_FILE" fi fi else echo "Device is unreacheble (?)" fi done
Тонкости (мой частный случай)
Можно брать список IP напрямую из SQL но я решил этого не делать - это единоразовая операция, или по крайне мере редкая. Соответвенно, результат я пишу в sql-файлик, для того что бы сохранить коммюнити и использовать их потом для бекапа конфиолв.