Edited at

脱cron!Rundeckでジョブスケジューラを構築

More than 1 year has passed since last update.


はじめに

既存の複数台のサーバーに対して定期実行する処理を作らなければならず、2017年にcronを書きまくるという選択肢は無いだろうと思いまして、いくつかジョブスケジューラを検討した結果Rundeckに落ち着いたので設定〜定期実行までのメモです。

試した環境はCentOS7です。


インストール


Javaのインストール

Javaが無ければRundeckは動きません。もしJavaがインストールされていなければインストールしてください。

yum install java-1.8.0


Rundeckのインストール

rpm -Uvh http://repo.rundeck.org/latest.rpm

yum install rundeck

以上でインストールは完了です。


Rundeckの設定


URLの変更

ローカルのブラウザからアクセスさせたいため、外からアクセスさせるグローバルIPなりドメインなりに変更します。

vi /etc/rundeck/rundeck-config.properties


rundeck-config.properties

grails.serverURL=http://ドメイン OR IP:4440



4440のポートを開ける

サーバー側、ネットワークのセキュリティで4440で通信出来るように設定しましょう


adminユーザーの設定


デフォルトのユーザー設定

ユーザー名:admin

パスワード:admin

でアクセスできます。

スクリーンショット 2017-06-23 10.49.25.png

この設定は/etc/rundeck/realm.propertiesに書かれているのですがパスワードも平文でセキュリティ的にも全く良くない状態です。


realm.properties

admin:admin,user,admin,architect,deploy,build



adminのパスワード変更とmd5化

まずはこの平文パスワードを変更して、設定ファイルの記述もmd5にします。

この例ではnewadminを新たなパスワードに設定します。

sudo java -cp /var/lib/rundeck/bootstrap/jetty-all-9.0.7.v20131107.jar org.eclipse.jetty.util.security.Password admin newadmin

すると以下のようなハッシュ値が生成されます

OBF:1x151t331u2a1y7z1b301t121x1h

MD5:b0a24b98c089b3b0f5d4174420cebe0c
CRYPT:advDltGLaH7Bo

ここの MD5:b0a24b98c089b3b0f5d4174420cebe0cの部分を丸コピーします。

そして、/etc/rundeck/realm.propertiesを開いて以下のように変更します。


realm.properties

admin:MD5:b0a24b98c089b3b0f5d4174420cebe0c,user,admin,architect,deploy,build



このスクリプトについて

/var/lib/rundeck/bootstrap/.jarファイルがあるのですが、Rundeckのバージョンによって微妙に番号が違うようです。cd /var/lib/rundeck/bootstrapして、jetty-all-から始まる.jarファイルのファイル名を使ってみてください。


新しいユーザーの追加

ここではadminと同等のユーザーpoweruser、パスワードmypasswordを追加します。


ユーザー追加コマンド

java -cp /var/lib/rundeck/bootstrap/jetty-all-9.0.7.v20131107.jar org.eclipse.jetty.util.security.Password poweruser mypassword


realm.propertiesに追記

adminの時と同じようにハッシュが生成されるのでコピーします。

以下のように/etc/rundeck/realm.propertiesにpoweruserの設定をadmin同様に追加します。


realm.properties

# admin

admin:MD5:b0a24b98c089b3b0f5d4174420cebe0c,user,admin,architect,deploy,build
# poweruser
poweruser:MD5:abc24b98c089b3b0f5d4174420cebe0c,user,admin,architect,deploy,build


aclpolicyの追加

ユーザーの権限設定などがこのaclpolicyファイルに書いてあります。

cd /etc/rundeck && llをすると、adminユーザーのaclpolicyや、今回変更はしませんがpropertiesなどのファイルがあります。

今回はadminと同じ権限のユーザーを作るので、adminのaclpolicyをコピーします。

cd /etc/rundeck

cp admin.aclpolicy poweruser.aclpolicy

これで新しいユーザーの設定は完了です。


rundeckを再起動

設定を反映します。

systemctl restart rundeckd


プロジェクトの追加


最低限の設定

ひとまず名前だけあればプロジェクト作成は出来ます

スクリーンショット 2017-06-23 11.57.03.png


ジョブの作成

Create Jobボタンからジョブの作成をします。

スクリーンショット 2017-06-23 11.57.54.png


ジョブの名前と説明の追加

スクリーンショット 2017-06-23 11.58.57.png


Workflowの追加

今回は Script を選択して、echo "this is TEST"を記入しました。

スクリーンショット 2017-06-23 12.01.09.png

スクリーンショット 2017-06-23 12.01.43.png

入力したらSaveボタンを押下して、ジョブのCreateボタンを押下します。


ジョブの手動実行

登録したジョブをRun Job Nowボタンから実行します。

スクリーンショット 2017-06-23 12.03.11.png

成功するとこんな感じの画像が表示されます。

スクリーンショット 2017-06-23 12.03.55.png


実行の詳細を確認

ReportのタブのNodeを見てみると、入力したechoの処理が実行されていることが分かります。

スクリーンショット 2017-06-23 12.39.37.png


ジョブの定期実行

ジョブの編集画面を開きます

Jobsメニュー⇒Edit this Jobです。

スクリーンショット 2017-06-23 12.41.02.png


Schedule to run repeatedly?を設定

ジョブの設定画面かからSchedule to run repeatedly?Yesに変更して設定していきます。

スクリーンショット 2017-06-23 13.03.13.png

かなり直感的にと言うか、見たまま設定してもらえれば大丈夫です。

スクリーンショット 2017-06-23 13.04.15.png


  • 何時に?

  • 毎日なのか?

  • 毎月なのか?

設定はこれだけです。Crontabモードもあるので、既存のCrontabから移植したりする際は便利そうです。

設定した時間を過ぎたら実行出来ているかを確認してみます。

確認方法は手動実行の時と同じです。


サーバーにログインして処理を実行

ここまではRundeckがインストールされたサーバーに対しての処理を行ってきました。ここからは実際に使うであろう他のサーバーにログインしての処理実行の方法を書いていきます。


前準備

Rundeckがインストールされているサーバーから処理を実行したいサーバーに対してパスワード無しの鍵認証ログインが出来るようになっている必要があります。


ノードの追加

ノードの追加が残念ながらGUIから出来ません。

設定ファイルを以下のように変更します。

今回はtestというプロジェクトを作成したので、以下のファイルを編集します。

/var/rundeck/projects/test/etc/resources.xml


resources.xml

<?xml version="1.0" encoding="UTF-8"?>

<project>
# 既にあるはずのlocalhostの設定
<node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="el7.x86_64" username="rundeck"/>

# 以下を追加
<node name="remotehost" description="Remote server node" tags="" hostname="10.1.0.12" osArch="amd64" osFamily="unix" osName="Linux" osVersion="6.5" username="remoteuser"/>
</project>


<project></project>に以下設定を追加していきます。


  • name:ノードの名前 (必須)

  • description:ノードの説明 (オプション)

  • hostname:接続先のIPアドレス (必須)

  • osArch:OSのアーキテクチャ (オプション)

  • osFamily: windowsとかunixとか (オプション)

  • osName:OS名 (オプション)

  • osVersion:OSのバージョン (オプション)

  • username:sshログインするユーザーの名前 (必須)

詳細はオフィシャルを

http://rundeck.org/docs/man5/resource-xml.html


秘密鍵のセット

今回は既に各SSHにログイン出来るユーザーが居て、秘密鍵と公開鍵のペアがある前提です。


デフォルトの秘密鍵の設定を確認

プロジェクトのホーム画面からConfigureボタンを押下します。

スクリーンショット 2017-06-23 22.13.32.png

Simple Configurationボタンを押下します。

スクリーンショット 2017-06-23 22.14.32.png

Default Node Executorを確認すると

スクリーンショット 2017-06-23 22.15.43.png

/var/lib/rundeck/.ssh/id_rsa

となっています。Default Node File CopierSCPにも同じ値がセットされていると思います。

今回はこの/var/lib/rundeck/.ssh/配下に既存の秘密鍵をセットしていきます。


秘密鍵のコピー

既にremoteuserというユーザーが居て、id_rsaがあって、接続先のサーバにはauthorized_keysがセットされているという前提です。

remoteuserの秘密鍵を/var/lib/rundeck/.ssh配下にコピーして、グループと所有者をrundeckに変更

cp /home/remoteuser/.ssh/id_rsa /var/lib/rundeck/.ssh/remoteuser_id_rsa

chown rundeck remoteuser_id_rsa
chgrp rundeck remoteuser_id_rsa


プロジェクトのkey設定を変更

既出のデフォルトの秘密鍵の設定を確認と同じ手順で設定画面に遷移します。

コピーしたremoteuserのキーを設定します。

スクリーンショット 2017-06-23 22.25.47.png


リモートサーバー実行の処理を追加

ジョブを開いて、WorkflowAdd a StepCommand - Execute a remote commandを設定していきます。

テストとしてpwdを実行します。

スクリーンショット 2017-06-23 22.29.29.png

Saveすると以下の状態になっているはずです。

スクリーンショット 2017-06-23 22.30.15.png


ノードの設定

Dispatch to Nodesを選択してNode Filterremotehostと入力すると、設定されたノードが候補として表示されます。

スクリーンショット 2017-06-23 22.31.35.png

ここまで設定したらSaveを押下して保存します。


リモートホストの実行確認

これまでと同じように実行をして、Succeededの表示が出ていれば成功です。

失敗すると以下のようにFaildの表示がされるので設定の再確認をしてみてください

スクリーンショット 2017-06-23 22.36.23.png


おわりに

これでジョブの定期実行とリモートホストでの実行が出来るようになりました。

cronはcronで手軽に実行出来るのですが、何の目的で誰が追加したか分からない設定が出てきたり、エラーが起きたり、今回のようにサーバーが複数ある時にそれぞれに設定を書いたりすると結構辛かったり、実行エラーが追いにくかったりと様々な問題もあったりします。

Rundeckが全て解決と言うのは少し違うと思いますが、少なくともcronで実行するよりは格段にクリアになる事が多いので、残りの今あるcronも徐々にこちらに移行していこうと思っています。

あと、操作していると感覚的にはJenkinsに近い気がしました。