![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
![]()
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
![]() Постоялец форума ![]() ![]() ![]() ![]() ![]() Группа: Модератор Сообщений: 967 Регистрация: 17.08.2004 Пользователь №: 4400 ![]() |
Немного поднимем градус гиковости
![]() Спешу предложить простой способ автоматизации по удаленному администрированию бооольшой кучи мобильных устройств под управлением сабжа. Как было до автоматизации, звонили оператору (межгород), он включал мобильное устройство, и от положительности результата мы обновляли что требуется. Так как на просторах нашей Родины связь не шибко хороша, а устройства установлены на движущихся (и довольно быстро) объектах, то перезвон и попытки достучаться могли продолжаться часами. С ростом числа устройств ситуация, понятное дело, становилась не айс :-( Смысл задачи в следующем: 1) иногда нужно обновлять ПО и всякую информацию на мобильных устройствах (компьютерах под управлением Linux) 2) устройства немного отличаются настройками, в частности маршрутной информацией. 2) сами устройства подсоединяются к головному офису по VPN (OpenVPN + GPRS) в момент доступности связи 3) данные устройства выходят на связь кое как, обычно по нажатию на кнопку включения 4) так как устройства путешествуют по разным городам и весям необъятной Родины, то на связи их поймать практически невозможно 5) желательно максимально минимизировать трафик, так как GPRS недешев... И так, решение по автоматизации связи. Для того, чтобы гарантированно иметь связь с устройством необходимо: - связь дожна присутствовать - идентифицировать устройство - иметь внутренний IP-адрес на момент связи - выполнить нечто для обновления информации, пока связь еще не померла. Все это нам обеспечил OpenVPN (ну и ПО по управлению модемами, но о нем здесь говорить не будем). Авторизация устройств в OpenVPN сделана по ключам, как описано во многих руководствах... Для нашей автоматизации нам нужно только добавить в конфиг на сервере OpenVPN вот такую команду, которая при подключении клиента передает в наш скрипт имя пользователя, его IP-адрес (и еще кучу всего): Код client-connect /etc/openvpn/scripts/client-connect.sh Сам скрипт client-connect.sh выглядит следующим образом. Код #!/bin/sh logfile="/mnt/archive/projects/schedules/openvpn-connections.log" datetime=`date` content=" " logline="$datetime: user $common_name connected (local $ifconfig_pool_remote_ip remote $untrusted_ip)" echo $logline >> $logfile initctl emit net-client-connected COMMONNAME=$common_name REMOTEIP=$ifconfig_pool_remote_ip Все дело в последней строке ![]() Для этого использовали upstart (есть в Ubuntu), который и поднимает соответствующий скрипт для автоматизации. Вот и он /etc/init/openvpn-network-client-up.conf Код start on net-client-connected stop on net-client-disconnected COMMONNAME=$COMMONNAME instance $COMMONNAME export COMMONNAME export REMOTEIP script exec /usr/local/bin/fab -f /root/scripts/fabfile.py update_schedule:$COMMONNAME,host=$REMOTEIP >> /tmp/upstart.log 2>&1 end script Здесь как раз и происходит самое интересное, запускается фреймворк ]]>http://www.fabfile.org/]]> Эта штука написана на питоне и может по ssh копировать и исполнять команды на удаленной и/или локальной системах. Для автоматизации самое оно. Большой плюс, что можно производить операции сразу с большой группой компьютеров, не имея на них ничего, кроме доступа по SSH. Для примера приведу простой fab-файл (/root/scripts/fabfile.py в моем примере), который копирует содержимое файла из нужной папки на удаленный компьютер в зависимости от наличия самого файла, после этого переименовывает скопированный файл на локальном компьютере. Код from fabric.api import env, run, put, sudo from fabric.context_managers import hide, cd from fabric.contrib.files import exists import os.path import os import datetime # remote login env.user = 'test' # remote password env.password='test' # username = COMMONNAME!!! def update_schedule(username): # собрать имя файла path = "/mnt/archive/projects/schedules/%s/scheduler.csv" % (username) # проверить, есть ли файл для копирования if os.path.exists(path): # копируем локальный файл на удаленный хост put(path,"/inbox/", use_sudo=True) # выполняем команду под суперпользователем на удаленном хосте sudo("touch /inbox/update.txt") # переименовываем локальный файл os.rename(path, path+"."+datetime.datetime.now().strftime("%Y%m%dT%H%M%S")) Итак, что получили в итоге: - все исполняется сразу, как только произошло VPN-соединение и связь не порвется в течении хотя бы минуты! - пересылка всякой чуши на удаленные компухтеры будет только тогда, и только тогда, когда есть что копировать (или забирать...) - доступ происходит только в направлении СЕРВЕР -> удаленный хост, что не рушит систему безопасности центра - если связь оборвалась в момент работы скрипта, все повторится заново при следующем подключении - почти не звоним больше операторам. PS. Устал писать, если интересно, спрашивайте. Сообщение отредактировано leah - 6.07.2011 - 18:31 |
|
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 26.04.2025 - 19:40 |