連載
» 2014年01月23日 18時00分 公開

OSS「JobScheduler」で実現するこれからの運用自動化(5):Nagiosと連携して運用自動化! 事例と適用ポイント (2/3)

[井上研一,@IT]

JobSchedulerを組み込んだサンプルシステムの開発

 それでは、JobSchedulerを組み込んだサンプルシステムの開発手順を紹介します。

 後述しますが、JobSchedulerにはPHPのAPIがあります。今回はCakePHPを使ってジョブ実行を管理するシステムを開発します。また、Nagiosと連携し、JobSchedulerでのジョブの実行結果を送る方法についても説明します。

サンプルシステムのトップページ

対象となるユースケース

 今回紹介するサンプルシステムは、以下の処理を行います。

  • JobChainの実行対象となるホストを登録する
  • 実行するJobChainを登録する
  • ホストとJobChainをひも付け、実行時間とパラメーターを設定し、JobSchedulerに連携させる(追加、変更、削除に対応する)
  • JobChainの実行ログを参照する

システムの前提条件

  • このシステムでは「JobChainの実行」を連携の対象とし、Standalone Jobの連携は行いません(実用上においても、後で紹介する“Nagiosへ結果を連携させるJob”など、共通的に組み込むべき機能をJobとして作成し、JobChainを組むという運用が多いのではないかと思います)。
  • JobおよびJobChainの定義そのものはJobScheduler Object Editorを使用するものとし、当システムの対象外とします。
  • 実行するJobの定義はJOEを使用してあらかじめ行われているものとします。

テーブル定義

サンプルシステムのテーブル定義

 サンプルシステムで作ったテーブルは3つです。

 job_chainsテーブルは、JOEを使用して定義したJobChainと、JobChainのパスでひも付きます。

 hostsテーブルは、JobChainの実行対象となるホストを示します。Nagiosと連携する際のホスト名も保持しています(Nagiosはホストおよびサービス単位で監視を行います)。

 job_chain_ordersテーブルは、JobChainとホストをひも付けます。つまり、「どのJobChainを、どのホストに対して実行するか」を示します。JobSchedulerでは、JobChainを実行するにはOrderの作成が必要なので、これはその単位でもあります。また、Nagiosと連携するサービス名も保持しています。

 さらに、JobScheduler側のデータベースから、Orderで実行したJobChainのログが保存されているscheduler_order_historyを参照しています。

 ここで開発したサンプルシステムは、筆者のGitHub上で公開しています。ただし、入力チェックが行われておらず、ほとんどテストされていないコードですのでご注意ください。実用には値しませんが、一通りの動作を確認することはできるでしょう。

【関連リンク】

サンプルシステムのGitHubリポジトリ

https://github.com/inoccu/jobhandler


JobSchedulerと連携するためのPHP API

 JobSchedulerは、Telnetで4444番ポート(デフォルト設定の場合)に接続し、XMLメッセージを送信することでOrderの登録や削除などを行うことができます。

 このXMLメッセージの仕組みをラップするライブラリを作成すれば、好みのプログラミング言語で開発を進めることができます。PHPについては、SOSからAPI(PHP XML Interface)が提供されているため、さらに簡単です。

 まず、Orderの登録と変更について見てみましょう。

// (1) JobScheduler Launcherのインスタンスを作成する
$launcher = new SOS_Scheduler_OrderCommand_Launcher('localhost', 4444, 30);
// (2) CakePHP Modelを使ってOrderのデータを取得
$jobChainOrder = $this->JobChainOrder->read();
// (3) 実行したいJobChainを指定して、JobSchedulerのOrderインスタンスを作成する
$order = $launcher->add_order($jobChainOrder['JobChain']['job_chain_path'], null);
// (4) OrderにIDをセットする
$order->replace = 'yes';
$order->id = $jobChainOrder['JobChainOrder']['id'];
// (5) Orderに実行時間をセットする
$order->run_time()->period()->single_start = $jobChainOrder['JobChainOrder']['run_time'];
// (6) Orderに実行時パラメーターをセットする
$order->addParam('HOST_NAME', $jobChainOrder['Host']['nagios_host_name']);
$order->addParam('SERVICE_DESC', $jobChainOrder['JobChainOrder']['nagios_service_description']);
for ($i=1; $i<=5; $i++) {
	if (!empty($jobChainOrder['JobChain']["param_name_$i"])) {
		$order->addParam($jobChainOrder['JobChain']["param_name_$i"], $jobChainOrder['JobChainOrder']["param_$i"]);
	}
}
// (7) 実際にJobScheudlerにOrderを登録する
$launcher->execute($order);

 JobschedulerのPHP APIでは、まず、Launcherと呼ばれるクラスのインスタンスを作成します(1)。Launcherクラスは、操作したい定義ごとに準備されています。引数は、使用するJobSchedulerのホスト、ポート、タイムアウトの秒数です。

 Launcherのadd_orderメソッドでOrderのインスタンスを作成します(3)。その際、実行したいJobChainのパスを指定します。JobChainのパスは、「jobhandler/WordPressBackupJobChain」のような、liveディレクトリからの相対パスです。メソッド名がaddとなっていますが、これでJobSchedulerのOrderが追加されるわけではありません。

 作成したOrderのインスタンスに対して、IDをセットします(4)。orderインスタンスのreplace要素に「yes」と指定しているので、IDの値が既存のOrderに一致している場合は、そのOrderが上書きされます。Orderの変更は、この方法で行うと簡単です(もちろん、IDの値に一致する既存のOrderが存在しない場合は、新規追加になります)。

 さらに、実行時間、パラメーターなども指定し(5〜6)、最後にLauncherのexecuteメソッドを使って、OrderをJobSchedulerに登録します(7)。

ジョブチェーンオーダー画面

 次に、Orderの削除を行う処理です。

// (1) JobScheduler Launcherのインスタンスを作成する
$launcher = new SOS_Scheduler_OrderCommand_Launcher('localhost', 4444, 30);
// (2) 削除したいOrderのJobChainパスとOrderのIDを指定して、Orderインスタンスを作成する
$order = $launcher->remove_order($jobChainOrder['JobChain']['job_chain_path'], $jobChainOrder['JobChainOrder']['order_id']);
// (3) 実際にJobScheudlerからOrderを削除する
$launcher->execute($order);

 削除の場合は、Launcherのremove_orderメソッドをJobChainパスとOrderのIDを引数に実行して削除用のOrderインスタンスを作成し(2)、executeメソッドで実行します(3)。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。