必見の記事

ジョブスケジューラ「Rundeck」を試してみる

2015.08.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

森永です。
最近は大逆転裁判をやりながら寝落ちするという毎日を送っています。

サーバ構築する上で、ジョブをどうするかというのは考慮が必要な点です。
簡単に実現するにはcronを使えばいいのですが、要件によってはジョブスケジューラを使わないと厳しいということがあります。 かと言って、エンタープライズで使われている本格的なジョブスケジューラを使うのも大げさすぎる、というのもわかります。

そこで今回は、簡単に構築ができてそれなりに痒いところには手が届くジョブスケジューラ「Rundeck」を試してみます。

Rundeckとは

OSSのジョブスケジューラです。
特徴として以下の様なものがあげられます。

エージェントレス

SSH接続できればジョブを実行できます。
なので、別サブネットはもちろん、別VPCでも別AWSアカウントでもはたまたオンプレでもRundeckサーバからSSH接続とジョブを実行できるユーザさえいれば大丈夫です!

ジョブネットを作成可能

ジョブAが正常に終わらないとジョブBを実行したくないと言った所謂、依存関係を設定できます。

cronと同様の記述が可能

商用ジョブスケジューラだとジョブを定義するためにいろいろ設定を書く必要がありますが、cronと全く同じ記述が可能です。
cronで動かしているものを単純移行も比較的容易に可能です。

失敗時の通知、再実行が可能

これだけでもcronから移行する価値があるかと思います。
単純に失敗したら通知するだけでも便利です。

rundeck構成

Rundeckを試してみる

RundeckはJavaベースでLinuxでもWindowsでもMacでも動きます。
今回はLinuxに導入してみます。

どのディストリビューションに対応しているかですが、インストールガイドにLinux: Most recent distributions are likely to workとあります。
最新のディストリビューションなら大概動くぽいです。今回はAmazon Linuxで行きます。
また、Javaのバージョンですが、1.7以上であればOpen JDKでもOracle JDKでも構いません。

いろいろなインストール方法がありますが、楽したいのでRPMからポチーっです。

# yum install java-1.7.0 
# rpm -Uvh http://repo.rundeck.org/latest.rpm 
# yum install rundeck 
# service rundeckd start

はい。インストール終了です。

これでブラウザからRundeckにアクセスできるようになるのですが、少し設定を行います。 /etc/rundeck/rundeck-config.properties の設定を変更します。
grails.serverURLを正しく設定しないとアクセスしてもlocalhostにふっとばされてうまくいきません。

$ vi /etc/rundeck/rundeck-config.properties

#loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG
loglevel.default=INFO
rdeck.base=/var/lib/rundeck

#rss.enabled if set to true enables RSS feeds that are public (non-authenticated)
rss.enabled=false
# change hostname here
grails.serverURL=http://<RundeckサーバのIP or ホスト名>:4440
dataSource.dbCreate = update
dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true;TRACE_LEVEL_FILE=4

これで設定も完了です。

ブラウザからアクセスします。
Rundeckのウェブコンソールのデフォルトポートは4440ですので、セキュリティグループの開放もしておきましょう。

rundeck01

ユーザ名admin、初期パスワードadminでログインするとWelcomeされます。

rundeck02

プロジェクトを作成します。
「Project Name」と「Default Node Executor」を設定するだけです。
今回はSSHで実行しますので、公開鍵を配置するディレクトリを指定します。(デフォルトでいきます)

rundeck03

プロジェクトが出来ましたので、早速ジョブを作成していきましょう。
Rundeckサーバのローカル実行とリモート実行で少し手順が違います。

rundeck04

ローカルサーバでの実行

まずはRundeckサーバのローカルで実行してみます。

「Job Name」と「Description」を入力します。
「Description」にはMarkdownを使うことが出来ますので、ジョブの詳細をわかりやすく記述しましょう。

rundeck05

ジョブのステップを設定します。
「If a step fails...」は失敗時の挙動、「Strategy...」は複数サーバ複数ステップ実行時の挙動を選択できます。
「Command」をステップとして登録してみましょう。

rundeck06

「Command」と「Step Description」を設定します。

rundeck07

複数ステップを一つのジョブに設定することも可能です。

rundeck08

「Nodes」で「Execute locally」を選択することでRundeckサーバのローカルで実行できます。 「Send Notification?」は設定することで、ジョブ成功時、失敗時、開始時にメールを送信することが出来ます。
ただし、メールの送信にはSMTPサーバの設定が必要です。

rundeck09

「Schedule to run repeadedly?」を設定することで定期ジョブを設定できます。 「Simple」と「Crontab」の2つの記法で設定できます。
「Crontab」を使えば慣れ親しんだCronの設定をそのまま使用できます。

rundeck10 rundeck11

他にも色々設定できますが、ひとまずデフォルトで行きましょう。

rundeck12

さあ、「Run Job Now」で即時実行しますよ!

rundeck13

ジョブの内容が内容なので一瞬で終わりましたが、無事終わったようです。ε-(´∀`*)ホッ
最初に表示されているのは「Summary」タブです。
いくつのノードで成功、失敗、未完了、未開始なのか一覧になっています。

rundeck14

「Report」タブを見ると各ノードの各ステップの結果をざっと見できます。

rundeck15

「Log Output」タブでは、出力の結果を確認できます。

rundeck16

リモートサーバでの実行

次に、リモートサーバで実行してみます。
ジョブを実行するサーバにRundeckサーバからSSHアクセスできるようにする必要があります。

プロジェクト作成時にSSHキーの場所を指定していましたので覗いてみましょう。
デフォルトだと/var/lib/rundeck/.ssh/id_rsaとなっていました。

# ll /var/lib/rundeck/.ssh/
total 8
-rw------- 1 rundeck rundeck 1679 Aug 27 10:31 id_rsa
-rw-r--r-- 1 rundeck rundeck  382 Aug 27 10:31 id_rsa.pub

公開鍵と秘密鍵があります。
公開鍵をジョブを実行したいサーバにRundeckユーザを作成し配置します。

# useradd rundeck
# su - rundeck
$ mkdir /home/rundeck/.ssh
$ chmod 700 /home/rundeck/.ssh
$ vi /home/rundeck/.ssh/authorized_keys
$ chmod 600 /home/rundeck/.ssh/authorized_keys

ノードの追加はWEB上からは出来ず、Rundeckサーバの/var/rundeck/projects/プロジェクト名/etc/resources.xmlを編集して追加します。

# vi /var/rundeck/projects/rundeck-test/etc/resources.xml
<?xml version="1.0" encoding="UTF-8"?>

<project>
  <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.14.35-28.38.amzn1.x86_64" username="rundeck"/>
  <node name="remote" description="Remote Server node" tags="" hostname="IPアドレス or ホスト名" osArch="amd64" osFamily="unix" osName="Linux" osVersion="CentOS 7 x86_64" username="rundeck"/>
</project>

username="rundeck"という指定があるので、こちらを変更すれば実行ユーザを変更可能です。
osArchosFamilyなどは実行サーバを指定するときに使用しますので、同じものであれば同じ値にしましょう。(厳密な値である必要はなさそうです。)

ノードの追加が完了したので、ジョブを作成しましょう。
テストなのでローカル実行したジョブをコピーして使っちゃいましょー。

rundeck17

ローカルジョブの「Action」→「Duplicate this Job」を選択します。 変更するのは「Nodes」の部分だけです。
「Dispatch to Nodes」を選択し、先ほど追加したノード名を「filter」に入力します。
「filter」にはOS名なども設定できます。

rundeck18

実行してみます。

rundeck19

リモート環境でもうまいこと行きました!!

rundeck20

さいごに

個人的には非常に直感的に設定できて使いやすいジョブスケジューラでした。
他にも色々設定できそうなのでいじくってみます。

前職でお客さんに「cronとジョブスケジューラはどう使い分ける?」と質問されたのを思い出しました。。。
いい思い出です。

参考資料

Rundeck.org - Job Scheduler and Runbook Automation