Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> HOWTO: автоматизация удаленных клиентов - openvpn + upstart + fabric
Рейтинг 5 V
leah
сообщение 6.07.2011 - 18:24

Постоялец форума
*****

Группа: Модератор
Сообщений: 967
Регистрация: 17.08.2004
Пользователь №: 4400


Немного поднимем градус гиковости wink.gif
Спешу предложить простой способ автоматизации по удаленному администрированию бооольшой кучи мобильных устройств под управлением сабжа.

Как было до автоматизации, звонили оператору (межгород), он включал мобильное устройство, и от положительности результата мы обновляли что требуется. Так как на просторах нашей Родины связь не шибко хороша, а устройства установлены на движущихся (и довольно быстро) объектах, то перезвон и попытки достучаться могли продолжаться часами. С ростом числа устройств ситуация, понятное дело, становилась не айс :-(

Смысл задачи в следующем:
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

Все дело в последней строке smile.gif нельзя соединиться по VPN с устройством, пока сам скрипт не отработал!!!

Для этого использовали 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
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 25.04.2024 - 01:11