...

понедельник, 21 июля 2014 г.

Как за два дня установить 80 новых IP-телефонов или история одного костыля

Здравствуйте, хабражители!

Недавно в компании, в которой я работаю, было принято решение о переходе на VoIP-телефонию, чтобы связать наконец-то наши многочисленные офисы в единую телефонную сеть. В качестве SIP-сервера был выбран очень интересный продукт Communigate Pro, который мы развернули на рассововерном Ubuntu 12.04. Долго определялись с абонентскими устройствами, одним из основных критериев, при выборе ТА, было наличие встроенного гигабитного свитча. В итоге выбор пал на телефонные аппараты (далее ТА) ESCENE GS330-PEN. Все бы ничего, но произошло страшное — подвел поставщик, поэтому внедрение сервиса перенеслось почти на пол года. Когда партия телефонов наконец была получена, нам был установлен жесткий дедлайн. Тут-то и возник вопрос: как быстро сконфигурировать и расставить на рабочих местах 80 ТА. Под катом вас ожидает несколько скриптов и алгоритм действий
Прикладная археология



Мы быстро прикинули, что на распаковку, подключение и конфигурирование одного ТА уходит около 30 минут, таким образом на всю работу придется потратить 5 человекодней, и это еще не считая времени, необходимое на то, чтобы дойти до конкретного рабочего места и подключить устройство. Такой роскоши мы себе не могли позволить, что заставило нас придумывать способ автоматизировать процесс. GS330, как любой приличный IP-телефон, имеет на борту WEB-консоль, и возможность подключения по telnet. «Под капотом» оказался, как не трудно догадаться, linux, что обнадеживало: уж линуксов то навидались всяких. Серфинг по каталогам показал, что в /mnt лежит пара интересных каталогов: sip и system — и в /mnt/sip таки было найдено искомое — конфиг, который представляет собой XML-файл ESConfig.xml, со всеми настройками, в том числе и персональными да еще и в UTF8 кодировке. Ну что может быть прекраснее?! Кстати, уже позже сообразил, что можно было просто сделать резервную копию настроек в WEB-консоли.
Автоматизируй это



В общем что делать стало понятно, остался вопрос «как?». Настроив один ТА, и убедившись в его работоспособности, мы получили эталонный конфиг, в котором оставалось только заменить следующее

  • Метку (строка, которая выводится напротив конфигурируемой линии)

  • Номер пользователя (номер является цифровым алиасом для учетной записи пользователя)

  • Имя пользователя

  • Пароль




Некогда было выдумывать изящные решения, поэтому в эталонном конфиге просто заменили эти сущности на _TELNUM_, _SIPPASSWD_, _REALNAME_. Кстати, в качестве метки выступает так же номер телефона, поэтому и _TELNUM_ используем дважды.

Дальше — дело техники. Призвав excel сформировали CSV файл (TAB в качестве разделителя) с данными пользователей, в таком виде: IP-адрес, номер телефона, пароль, реальное имя пользователя. Как видите, было принято решение закрепить за каждым пользователем определенный IP-адрес.


Дело за малым — скрипт, который подготовит нам N конфигурационных файлов, вот он:



$ cat ./genconf

#!/bin/sh

OIFS="$IFS"
IFS=' '

cat $1|while read ipaddr telnum sippasswd realname do
cat ./ESConfig.tmpl | sed 's/_TELNUM_/'$telnum'/g'|sed 's/_SIPPASSWD_/'$sippasswd'/g'|sed 's/_REALNAME_/'$realname'/g'> ./confs/$ipaddr.xml
done

IFS="$OIFS"




запускаем его, в параметре указывая имя CSV-файла с данными пользователей

$ ./genconf ./users.csv




после чего в папке confs появится куча конфигов вида ipaddr.xml
Резервируй это



ТА из коробки настроены на получение IP-адреса от DHCP сервера, что для нас в условиях жесткого цейтнота явилось несомненным благом. Памятуя о том, что мы решили закрепить за каждым пользователем свой IP-адрес, логично будет создать в DHCP резервирования для каждого ТА, надо только не забыть собрать все MAC-адреса устройств в один файл, и снова с разделителями. Файл будет такого вида telnumber,ip_addr,mac_addr. Мы используем Active Directory, и DHCP у нас тоже на виндовом сервере. Выяснилась внезапная но неприятная вещь — в MMC оснастке не нашлось функции импорта, поэтому пришлось использовать инфернальное детище скриптовые средства Windows:

@echo off

for /f "delims=, tokens=1,2,3" %%i in (mac.csv) do (
netsh dhcp server \\192.168.1.8 Scope 192.168.255.0 Add reservedip %%j %%k "T%%i" "DHCP"
)




IP-адрес DHCP-сервера, конечно, нужно подставить ваш собственный.
Летите, голуби, летите!



Все готово, осталось только разослать конфигурационные файлы по своим ТА. Используем немного магии и средства WEB-разработчика из Google Chrome. Потыкав в WEB-консольке ТА, и почитав исходники генерируемых страниц, были выяснены URL-ы, на которые посылаются запросы при аплоаде конфигов и при перезагрузке (к сожалению конфиг без перезагрузки применяется только частично). В итоге родился следующий скрипт (я разместил его в /opt/VoIP):

#!/bin/sh

cd /opt/VoIP
confs="./confs" # path to confs directory

echo `date +"%d/%m/%y %H:%M:%S: "` "Sending confs">>/var/log/sendconf.log

for file in `ls $confs`;
do
ipaddr=${file%.*}

if ping -W 1 -c 1 $ipaddr > /dev/null; # Availability check
then
reply=`curl --user root:root --form binary=@$confs/$file --form httploadConfig=OK http://$ipaddr/goform/upldForm_Config`

if echo $reply | grep --quiet netchanged_reboot.asp ; then
curl --user root:Pa$$w0rd --form RebootNOW=OK http://$ipaddr/goform/Reboot
rm $confs/$file
echo `date +"%d/%m/%y %H:%M:%S: "` "$ipaddr.xml is deleted">>/var/log/sendconf.log
else
echo `date +"%d/%m/%y %H:%M:%S: "` "New configuration is not upload to $ipaddr">>/var/log/sendconf.log
fi
else
echo `date +"%d/%m/%y %H:%M:%S: "` "Host is unreachable">>/dev/null
fi
done

echo `date +"%d/%m/%y %H:%M:%S: "` "-----">>/var/log/sendconf.log




Для пущей няшности заставим работать скрипт по cron-у, каждые три минуты:

*/3 * * * * root /opt/VoIP/sendconf




Думаю здесь надо дать пару комментариев. Скрипт читает содержимое каталога ./confs и вычленяет из названия файлов IP-адрес, на который нужно передавать XML-ку. Для передачи будем использовать curl, предварительно проверяя ТА на доступность пингом. Обратите внимание, что при посылке конфига для авторизации используется пара root:root — это заводские значения, и если аплоад прошел успешно, то отправляем ТА в перезагрузку, но для авторизации уже используем новый пароль root:Pa$$w0rd — эта настройка применяется сразу (Pa$$w0rd — это пароль, который у нас уже содержится в эталонном конфиге). Для отлавливания багов и чтобы совсем было труъ добавили логирование основных этапов в /var/log/sendconf. Остается перезапустить cron, и, поплевывая, наблюдать как весело моргают индикаторами ТА на столах сотрудников при перезагрузке.
Вместо заключения



Вот так в очередной раз, при помощи палок и синей изоленты мы автоматизировали еще одно внедрение, которое по мнению производителя и автоматизировать-то не нужно. Честно говоря непонятно, почему многие вендоры не предоставляют средств быстрого массового деплоя своих устройств. Буду чертовски счастлив, если наше решение облегчит жизнь кому-то еще. По большому счету, такую технологию можно применять и к другим устройствам, но скрипты придется либо сильно дорабатывать напильником, либо вообще — писать собственные, но в любом случае технология должна быть понятна.

Ну и как сказал бы Нолик

image


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий