はじめに
既存の複数台のサーバーに対して定期実行する処理を作らなければならず、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
grails.serverURL=http://ドメイン OR IP:4440
4440のポートを開ける
サーバー側、ネットワークのセキュリティで4440で通信出来るように設定しましょう
adminユーザーの設定
デフォルトのユーザー設定
ユーザー名:admin
パスワード:admin
でアクセスできます。
この設定は/etc/rundeck/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
を開いて以下のように変更します。
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同様に追加します。
# 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
プロジェクトの追加
最低限の設定
ひとまず名前だけあればプロジェクト作成は出来ます
ジョブの作成
ジョブの名前と説明の追加
Workflowの追加
今回は Script を選択して、 echo "this is TEST"
を記入しました。
入力したらSaveボタンを押下して、ジョブのCreateボタンを押下します。
ジョブの手動実行
登録したジョブをRun Job Nowボタンから実行します。
実行の詳細を確認
Report
のタブのNode
を見てみると、入力したechoの処理が実行されていることが分かります。
ジョブの定期実行
ジョブの編集画面を開きます
Jobsメニュー⇒Edit this Jobです。
Schedule to run repeatedly?を設定
ジョブの設定画面かからSchedule to run repeatedly?
をYes
に変更して設定していきます。
かなり直感的にと言うか、見たまま設定してもらえれば大丈夫です。
- 何時に?
- 毎日なのか?
- 毎月なのか?
設定はこれだけです。Crontabモードもあるので、既存のCrontabから移植したりする際は便利そうです。
設定した時間を過ぎたら実行出来ているかを確認してみます。
確認方法は手動実行の時と同じです。
サーバーにログインして処理を実行
ここまではRundeckがインストールされたサーバーに対しての処理を行ってきました。ここからは実際に使うであろう他のサーバーにログインしての処理実行の方法を書いていきます。
前準備
Rundeckがインストールされているサーバーから処理を実行したいサーバーに対してパスワード無しの鍵認証ログインが出来るようになっている必要があります。
ノードの追加
ノードの追加が残念ながらGUIから出来ません。
設定ファイルを以下のように変更します。
今回はtest
というプロジェクトを作成したので、以下のファイルを編集します。
/var/rundeck/projects/test/etc/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ボタンを押下します。
Simple Configurationボタンを押下します。
/var/lib/rundeck/.ssh/id_rsa
となっています。Default Node File Copier
のSCP
にも同じ値がセットされていると思います。
今回はこの/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設定を変更
既出のデフォルトの秘密鍵の設定を確認
と同じ手順で設定画面に遷移します。
リモートサーバー実行の処理を追加
ジョブを開いて、Workflow
のAdd a Step
のCommand - Execute a remote command
を設定していきます。
テストとしてpwd
を実行します。
ノードの設定
Dispatch to Nodes
を選択してNode Filter
にremotehost
と入力すると、設定されたノードが候補として表示されます。
ここまで設定したらSaveを押下して保存します。
リモートホストの実行確認
これまでと同じように実行をして、Succeeded
の表示が出ていれば成功です。
失敗すると以下のようにFaild
の表示がされるので設定の再確認をしてみてください
おわりに
これでジョブの定期実行とリモートホストでの実行が出来るようになりました。
cronはcronで手軽に実行出来るのですが、何の目的で誰が追加したか分からない設定が出てきたり、エラーが起きたり、今回のようにサーバーが複数ある時にそれぞれに設定を書いたりすると結構辛かったり、実行エラーが追いにくかったりと様々な問題もあったりします。
Rundeckが全て解決と言うのは少し違うと思いますが、少なくともcronで実行するよりは格段にクリアになる事が多いので、残りの今あるcronも徐々にこちらに移行していこうと思っています。
あと、操作していると感覚的にはJenkinsに近い気がしました。