Как за два дня установить 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

© Habrahabr.ru