CentOS 7にいろいろなシステムと連携できるジョブスケジューラー『Rundeck』をインストールする

ジョブスケジューラーについていろいろと物色しているのだが、最近であればやはりRundeckは触っといたほうがいいだろうと思ったのでCentOS 7に入れていじってみることにする。
「Rundeck」は、Webベースのインターフェイスを持つ軽量なエージェントレス(ssh接続)のジョブスケジューラーだ。また、プラグインなどを用いて他のシステムと連携して、特定のログなどをトリガーにジョブをキックさせることもできる(この辺はStackStormのほうが対応数が多いっぽい。その他Apache NifiとかHugginとかのIFTTTに影響を受けたプロジェクトのほうが強いかも?)。
ジョブの記述もcronと同じように記述できるので手軽なようだ。一応、ジョブネットも作成可能らしい。

とりあえず、まずはインストールをしてみよう。
インストール先にはCentOS 7を用いる。なお、お試しなので冗長化はせず、FirewalldやSELinuxも無効化する。

1.インストール

RundeckはJavaで記述されているので、まずはJavaの実行環境から。
以下のコマンドでインストールする。

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u101-b13/jdk-8u101-linux-x64.rpm
rpm -ihv jdk-8u101-linux-x64.rpm

次に、Rundeckをインストールする。

rpm -Uvh http://repo.rundeck.org/latest.rpm
yum install -y rundeck
systemctl start rundeckd

これで、Rundeckのインストールおよびサービス起動ができた。

2.初期設定

次に、Rundeckの設定ファイル(/etc/rundeck/rundeck-config.properties)を編集してブラウザから管理コンソールにアクセスできるようにする。

sed -i '/^grails/c grails.serverURL=http://[RundeckのIPアドレスorホスト]:4440' /etc/rundeck/rundeck-config.properties
systemctl restart rundeckd

3.ブラウザからアクセスする

さて、初期設定が完了したらブラウザからアクセスしてみよう。
「http://[RundeckのIPアドレスorホスト]:4440」にアクセスするとログイン画面が表示される。
初期ID/PWは「admin/admin」となっている。

ログイン後のトップページを見るとわかるが、Rundeckではプロジェクトがないとジョブを登録できないので、まずはプロジェクトを作成する。
[New Project]をクリックして、プロジェクトを作成する。
とりあえず、「Project Name」と「SSH Key File path」だけ設定しておけばいいだろう。そのままプロジェクトを作成する。

これで、ジョブが作成できるようになった。

4.Rundeckサーバ自身でのジョブ実行

まずはRundeckサーバ自身でジョブを実行させる。
「Create a new Job ...」をクリックし、ジョブ作成画面に遷移する。

ジョブ名およびその説明文について記述する。
オプションについては、今回は設定しない。

次に、ジョブで実行するステップ(コマンドとかスクリプトの流れ)を設定する。
「If a step fails」はジョブ失敗時の挙動(「Stop at the failed step.」は失敗したステップでジョブを停止する、「Run remaining steps before failing.」は失敗したステップをスキップして残りのステップを実行させる)、「Strategy」はジョブの実行時の挙動(「Node-oriented」はノード単位での実行、「Step-oriented」はステップ単位での実行)となる。とりあえず、デフォルトでは「失敗したステップでジョブを停止する」「ノード単位での実行」となる。

「Add a Step」でスクリプトやコマンドなど、実行させるステップについて定義できる。
とりあえず、ここではCommandを選択する。

実行するコマンドの入力画面に切り替わるので、(今回はテストなので適当に)入力する。
コマンドの説明についてもわかるように記述する。

今回はローカルなので、「Execute locally」を選択。

「Send Notification?」の箇所で、ジョブの実行結果の通知設定を行うことができる。
メールの送信にはSMTPサーバなどの設定が必要になるので、今回は設定しない。

ジョブの実行スケジュール設定。
時間等をそのまま指定する方法と、crontabと同じフォーマットで指定する方法がある。

とりあえず、以上でジョブの作成を完了にする。
トップページから「Run Job Now」を実行してジョブを実行してみよう。

実行した結果がこちら。
無事ジョブの実行がされたことが分かる。

5.リモートサーバでのジョブ実行

さて、ローカルだけジョブを実行しててもあまり意味がないので、次にリモートサーバに対しジョブを実行してみよう。
Rundeckでリモートサーバに対して処理を行う場合は、sshログインできるようにする必要がある。プロジェクト作成時に鍵ファイルのPATHを指定している(デフォルトでは「/var/lib/rundeck/.ssh/id_rsa」にある)ので、その鍵ファイルをリモートサーバにコピーしてやろう。
ここでは、事前にリモートサーバ側でユーザ「rundeck」を作成、パスワードを設定しているものとする(鍵のコピー後は「passwd -d rundeck」でパスワードを削除する)。

ssh-copy-id -i /var/lib/rundeck/.ssh/id_rsa.pub rundeck@[リモートサーバ IPorホスト名]

次に、Rundeckにリモートサーバの情報を登録する。
Web管理画面からは登録できないようなので、コンソールから設定ファイルを編集する。
ノードの追加は、「/var/rundeck/projects/プロジェクト名/etc/resources.xml」に記述することで行える。
(以下の例では、イメージしやすいようosVersionなどはとりあえず入れてあるのだが、実際の環境に合わせて書き換えてもらいたい。)

sed '/^<\/project>/i\
  <node name="サーバ名" description="説明" tags="タグ" hostname="IPアドレスorホスト名" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.10.0-327.el7.x86_64" username="rundeck"/>' \
   -i.bk /var/rundeck/projects/*/etc/resources.xml

設定ファイルに追記したら、もう管理画面上からもリモートサーバを指定できるようになる。
今回は、とりあえず先ほどローカル向けに作成したジョブにノードを追加する。

「Nodes」のとこで「Dispatch to Nodes」を選択し、先ほど追記したノード名で検索する(このとき、部分一致で検索する場合は「.*」でちゃんと正規表現を書いてあげる必要がある)。

filterでの検索結果にジョブの実行対象となるノードが出ている状態で保存し、ジョブを実行してみよう。

無事、ジョブの実行ができた。
ノードの追加のとこがちょっと面倒な気はするが、悪くなさそうだ。

いろいろなプラグインもあるので、少しづつ使ってみよう。


参考