読者です 読者をやめる 読者になる 読者になる

Rundeckをクラスターモードで構築する

こんにちはmatsです。

最近、更新サボってましたが久しぶりの投稿です。

 

今回は前に下の記事でご紹介していたジョブスケジューラー「Rundeck」について書こうかと思います。

http://tech.im-dmp.net/archives/1681

最近、2.6.0がリリースされたのでアップデートを行ったのですが、改めてドキュメントを見なおしてみるとクラスター構成が組めるみたいだったのでチャレンジしてみました。

そんなに難しくはないのですが、ドキュメントがあまり綺麗にまとまっていなかったりするので、参考になれば幸いです。

 

Rundeckとは

rundeck-logotype-512

オープンソースで開発されているJava製のジョブスケジューラーです。

SSHで対象サーバに接続し、決められた処理を行えるのが基本機能になるのですが、EC2連携のプラグインを使うことでEC2側のタグやインスタンスタイプ、AZなどで対象サーバをフィルタリング出来のが非常に強力です。

rundeck1

IMではバッチ処理等の他にデプロイ処理や覚えにくいREST APIコールなども登録して運用しています。

 

Rundeckのクラスター構成

全体構成はこんな感じです。

rundeck_infra

設定やログを外出しできるので、構成的にはオートスケール出来るのですが、さすがにジョブの最中にライフサイクルが走ると困るのでやっていません。

EC2のインスタンスはそれほど強くなくて大丈夫なのですが、javaのout of  memoryが怖いのでt2.medium(RAM:4GB)を使っています。

また、クライアント証明書による認証を行う関係でnginxを挟んでいますが、ELB→Rundeck(jetty)の様に直接受けてもいいかもしれません。

 

設定まわり

 

基本的には yum や apt-get でインストールすればすぐに動くのですが、クラスターを組む際はいくつか設定を変更する必要があります。

 

設定をMySQLに持たせるようにする

デフォルトの設定だと下記のようになっていて、サーバ内に設定を保持してしまうのでMySQL内に持つように変更します。

/etc/rundeck/rundeck-config.properties

dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true;TRACE_LEVEL_FILE=4

これを下記のように書き換えます。

dataSource.url = jdbc:mysql://{{ mysql_host }}/{{ mysql_database }}?autoReconnect=true
dataSource.username = {{ mysql_user }}
dataSource.password = {{ mysql_password }}

# Enables DB for Project configuration storage
rundeck.projectsStorageType = db

# Encryption for project config storage
rundeck.config.storage.converter.1.type = jasypt-encryption
rundeck.config.storage.converter.1.path = projects
rundeck.config.storage.converter.1.config.password = mysecret

# Enable DB for Key Storage
rundeck.storage.provider.1.type = db
rundeck.storage.provider.1.path = keys

# Encryption for Key Storage
rundeck.storage.converter.1.type = jasypt-encryption
rundeck.storage.converter.1.path = keys
rundeck.storage.converter.1.config.password = mysecret

 

ログをS3に出力するようにする

下記設定を追加し、rundeck-s3-log-pluginを有効化します。

/etc/rundeck/rundeck-config.properties

rundeck.execution.logs.fileStoragePlugin = org.rundeck.amazon-s3

 

また、下記のようにログの出力先を設定します。

/etc/rundeck/framework.properties

#name of the bucket
framework.plugin.ExecutionFileStorage.org.rundeck.amazon-s3.bucket = {{ s3_bucket }}

#path to store the logs
framework.plugin.ExecutionFileStorage.org.rundeck.amazon-s3.path = logs/${job.project}/${job.id}/${job.execid}.log

#  AWS region name
framework.plugin.ExecutionFileStorage.org.rundeck.amazon-s3.region = ap-northeast-1

 

クラスターモードの有効化

下記設定を追加し、クラスターモードを有効化します。

/etc/rundeck/rundeck-config.properties

rundeck.clusterMode.enabled = true

 

また、個々のサーバを識別するためのserverUUIDを設定します。

値のフォーマットのバリデーションがあるみたいなので、uuidgen などで生成するのがいいかと思います。

/etc/rundeck/framework.properties

rundeck.server.uuid = 00000000-0000-0000-0000-000000000000

 

IMの場合は起動時に読まれるシェルスクリプト(/etc/rundeck/profile)内で生成するようにしています。

sed -i -e "/^rundeck.server.uuid/c\rundeck.server.uuid = $(uuidgen)" /etc/rundeck/framework.properties

 

ELBのスティッキーセッションを設定する

Rundeckはjettyというアプリケーションサーバが発行するCookieでセッション情報を管理しているので、ELBのセッション維持にこのCookieを用いるように設定します。

Cookie名は JSESSIONID です。

jsessionid

ちなみにこの設定をしないと別のサーバにバランシングされた瞬間にログアウトします。。。

 

 

あとはRundeckのプロセスを起動するだけでクラスターに参加します。楽ちんですね(´∀`)

 

 

おすすめプラグイン

大したものは入れてませんが、一応紹介しておきます。

rundeck-ec2-nodes-plugin

RundeckからEC2のAPIをコールして、インスタンス情報を取得することが出来るプラグインです。

 

rundeck-s3-log-plugin

ジョブの実行ログをS3におくプラグインです。

 

rundeck-slack-incoming-webhook-plugin

ジョブの通知をSlackのIncomming Webnoohに送るプラグインです。

↓こんな感じです。

Slack

 

 

Rundeckのクラスタリングについて日本語で書いてあるドキュメントはあまりないみたいなので、参考にして頂ければ幸いです。

(本家のドキュメントはこちら → http://rundeck.org/docs/administration/scaling-rundeck.html

 

 

AnsibleのPlaybookも公開しているので、Vagrantで試す際は使って頂ければと。

https://github.com/mats116/ansible-playbook-rundeck