HTTP要求を使用してホストの大規模なグループを管理する

100-150台のクライアントマシン(情報端末など)があり、コマンドを定期的に送信して(更新、クリーンアップ、再起動など)実行する必要があるとします。l2tpトンネルを使用でき、sshを使用できますが、簡単! サーバーへの定期的なget要求を使用します。





この記事では、実装の最も単純な例を検討しますが、個人のニーズに合わせて簡単に完成して作り直します。





そのため、サーバーにはApache + php + MySQLが必要です。 クライアントには、十分なbash'aとwget'aがあります。



クライアント側の説明から始めましょう。

各クライアントには独自の一意のIDがあり、データベースと通信するために必要です。 IDは、クライアントごとに静的に登録するか、プロセッサまたはMACのシリアル番号、ハードドライブなどのシリアル番号などのシステムパラメーターから生成できます。または、md5の合計を一度に取得することもできます。 実装オプションの1つを次に示します。



#!/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によって起動されます。 たとえば、1分に1回。



#!/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







この例では、このテーブルは役に立ちませんが、実際には非常に役立ちます。 最初の列はクライアントマシンの名前(ホスト名)、2番目は説明、3番目はそのIDで、サーバーはそれを認識します。

第二に、顧客のためのタスクを設定するベース。 こんな感じです。



ID TASK STAT

2b0fa075e3ca1b4ee9 open_l2tp.tsk is_done

7d6f4f92f10a9b3bb3 open_l2tp.tsk wait







その中には、3つの列もあります。 最初はID、2番目は配信されたタスク、3番目は実行ステータスです。

ステータスが「待機」のエントリをテーブルに追加すると、クライアントはタスクを取得し、ステータスを「完了」に変更します。 その後、レコードを送信または削除するか、単にこのテーブルに残すことができます。 そして、このデータベースへのリクエストを単純な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を使用します。



まあ、それがすべてです。 誰かが役に立つといいな。



All Articles