Nagiosと連携して運用自動化! 事例と適用ポイント: OSS「JobScheduler」で実現するこれからの運用自動化(5)(2/3 ページ)
最終回となる今回は、JobSchedulerの日本での活用事例を紹介し、さらにJobSchedulerを組み込んだ簡単なシステムを実際に開発してみようと思います。
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上で公開しています。ただし、入力チェックが行われておらず、ほとんどテストされていないコードですのでご注意ください。実用には値しませんが、一通りの動作を確認することはできるでしょう。
JobSchedulerと連携するためのPHP API
JobSchedulerは、Telnetで4444番ポート(デフォルト設定の場合)に接続し、XMLメッセージを送信することでOrderの登録や削除などを行うことができます。
このXMLメッセージの仕組みをラップするライブラリを作成すれば、好みのプログラミング言語で開発を進めることができます。PHPについては、SOSからAPI(PHP XML Interface)が提供されているため、さらに簡単です。
【関連リンク】
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.