Как стать автором
Обновить

Управление большой группой хостов при помощи http запросов

Время на прочтение3 мин
Количество просмотров823
Допустим мы имеем 100-150 клиентских машин (ну например информационных терминалов) и нам нужно периодически некоторой их части посылать команды на выполнение (обновление, очистка, перезагрузка и т.д.), можно использовать туннели l2tp, можно использовать ssh, но мы поступим проще! Будем использовать обычные get запросы к нашему серверу.


В данной статье мы рассмотрим самый просто пример реализации, но он легко доделывается и переделывается под личные нужды.


И так, на сервере нам понадобится Apache + php + MySQL. На клиентах нам хватит bash’a и wget’a.

Начну с описания клиентской части.
Каждый клиент будет иметь свой уникальный ID, он будет нужен для общения с базой данных. ID можно, либо статически прописывать каждому клиенту, либо генерировать из таких параметров системы как серийный номер процессора или MAC’a, или серийника винчестера и тому подобного, ну или же брать md5 сумму от всего сразу. Вот один из вариантов реализации.

#!/bin/bash
scpu=`lshw -C cpu|grep serial|awk '{print $2}'`
macu=`ifconfig eth0|grep HWaddr|awk '{print $5}'`
mbs=`lshw|grep "configuration: uuid"|awk '{print $2}'`
echo $scpu $macu $mbs>/tmp/idu.key
md5sum /tmp/idu.key|awk '{print $1}'

А вот скрипт сбора команд с севера, он будет запускается cron’om через нужные нам промежутки времени. Например раз в минуту.

#!/bin/bash
idu=`/scripts/idu.sh
wget --no-check-certificate -q -O /tmp/task.md 192.168.3.92/id_task.php$
echo "TASK `cat /tmp/task.md`"
task=`cat /tmp/task.md`
task1="11"
if [[ "$task1" < "$task" ]]
then
touch /opt/apps/tasks/`echo $task`
fi

Смысл его в том, что он дает запрос в базу, а та передает значение поставленного таска, после чего скрипт создает одноименный файл который в последствии будет обработан следующим скриптом. Данная система сделана для того чтобы скрипт запросов и выполнения могли работать независимо. В нашем случае это было сделано для того чтобы задачи мог ставить не только сервер, но и GUI терминала и некоторые другие системные скрипты.
Собственно, пример скрипта обрабатывающего задания.

#!/bin/bash
taskfile="/opt/apps/tasks/open_l2tp.tsk"
if [ -f $taskfile ]
then
echo "Open L2PT"
rm $taskfile
/etc/init.d/xl2tpd start
fi
#И далее по списку

Как видим, все реализовано очень просто.

Теперь поговорим о серверной части.
Во-первых, мы имеем таблицу с информацией по клиентам, она будит выглядеть примерно так.

NAME OP ID
term1 (Морская 41) 7d6f4f92f10a9b3bb3
term2 (Беляева 32) 2b0fa075e3ca1b4ee9

В нашем примере эта таблица нам не пригодится, но на практике она бывает очень полезна. Первый столбец — имя клиентской машины(hostname), второй — описание, третий — это его ID, посредством которого сервер его опознает.
Во-вторых, база в которую мы будим ставить задачи для клиентов. Выглядит вот так.

ID TASK STAT
2b0fa075e3ca1b4ee9 open_l2tp.tsk is_done
7d6f4f92f10a9b3bb3 open_l2tp.tsk wait

В ней у нас будет тоже 3 столбца. Первый — ID, второй — поставленный таск, третий — статус выполнения.
Добавляем запись в таблицу со статусом “wait”, клиент забирает задание и меняет статус на “is done”. После чего, запись можно отправлять либо удалять, либо просто оставлять в данной таблице. А обрабатывать запросы к этой базе мы будем простеньким php скриптом.

<?
$ID = $_GET['ID'];
$dbcnx=@mysql_connect(localhost,base,*********);
mysql_select_db(TERM, $dbcnx);
$ath=mysql_query("select * from term_task where ID='$ID' and STATUS='wait';");
$term=mysql_fetch_array($ath);
$TASK=$term['TASK'];
$ath=mysql_query("UPDATE term_task SET STATUS='is done', DATA_S='$DATE' WHERE ID='$ID' and STATUS='wait';");
echo $TASK;
?>

Если информация передается важная и секретная, то можно воспользоваться https, а если информация уж совсем секретная, передаваемые данные можно шифровать AES-256 и тому подобным. Например при помощи mcrypt.

Ну вот собственно и все. Надеюсь кому то это пригодится.
Теги:
Хабы:
0
Комментарии7

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн