Rundeck
Rundeckとは簡単にいうと高機能なcronです。
cronと言われると、「サーバにログインしてcrontabで編集して…」というのを思い浮かべますが、Rundeckは違います。
Web GUIからスケジューリングします。
実行サーバとRundeckサーバは独立しています。
実行履歴がWeb GUI上から閲覧できます。
Rundeckの機能はまだまだ沢山あるのですが、cronと比較しながらRundeckを紹介していきます。
ジョブをスケジュールする
cron
cronはcrontabコマンドを使い、下記のようなcron書式でジョブの実行スケジュールを記述します。
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ 10 * * * * /bin/which bash > /dev/null 2>&1 30 0 * * * /bin/echo '00:30' > /dev/null 2>&1
Rundeck
RundeckはWeb GUIもしくはAPIでスケジュールの登録を行います。
cronに似た書式で、秒単位まで指定できます。
(cronは分単位が最小)
書式知らなくても設定できるインターフェイスも用意されています。
コマンドの実行
cron
ローカルでコマンドを実行します。
コマンドもcrontabで書きます。
Rundeck
ローカルで実行するかリモートで実行するか、
コマンドを実行するかスクリプトを実行するか
様々な選択肢があります。
更に、ジョブ同士に依存関係を持たせてワークフローを構築することができます。
当然cronでもsshしてリモート・サーバーでジョブを実行することはできるし、スクリプトを書いてワークフローを構築することもできます。
けれどもRundeckを使えばリモート・サーバもワークフローも可視化され一元管理できます。
Rundeckのワークフロー設定に Strategy(戦略)というのがあるのですが、少しわかりにくいので補足を。。。
A -> B -> C
D -> E -> F
という2つのワークフローがあったときに、
Node-oriented:
node1 node2 A D ↓ ↓ B E ↓ ↓ C F
Step-oriented:
node1 node2
A → B
↓
C E
↓
G ← F
のようになります。
実行履歴の確認
cron
標準出力をファイルにリダイレクトして実行履歴を確認するケースが多いですかね。
デフォルトではmailに通知されます。
/dev/null に標準出力を捨ててしまっているのをよく見かけますが、これだと実行されたかどうかさえ良くわからないですね。
Rundeck
Rundeckでは実行履歴が管理されており、Web GUI上から閲覧できます。
リンクをタップすれば詳細も見れます。
実行結果はどんどん増えていくので、放置するとCPUがリークします。
RDBにインデックス張りましょう。。。
参考: Rundeck との闘争 | 日々是ウケ狙い
スケジュール外実行
cron
スケジュールと関係なく実行したいとき、cronだとcrontab -lでコマンドを表示して、コピペして実行・・・のようなことするのが多いのではないでしょうか。
Rundeck
Rundeckだったら登録済みのジョブはボタンぽちでいつでも実行できます。
タイプミス、コピペミスすることがないですし、cron実行時の書式とターミナルから実行時の書式が違う問題*に出くわすこともありません。
cron書式と実行書式が異なる例)
cron : date +”\%Y\%m\%d
ターミナル: date +”%Y%m%d
※ cronでは%のエスケープが必要なのです。
通知
cron
cronはデフォルトでメール通知がくるようになっています。
スクリプト内でいろいろ書けばその他の通知も可能ですが、仕組みとしてはメール通知以外にありません。
Rundeck
Rundeckはデフォルトでメール通知とWebhook、プラグインでSlack通知などが行なえます。
Slack連携を行うとこんな通知がくるようになります。
High Availability
cron
cronにはHAなどありません。
サーバが死んだらcron設定も飛びます。
Rundeck
RundeckはHA構成を組むことができます。
(クラスタではなくactive-standbyですが)
完全なHA構成の構築方法は後ほど別の記事に書きます。
ワークフローのファイル管理
複数人でワークフローを作成したり閲覧したりする場合にはやはりGitでリポジトリ管理したくなります。
cron
実は設定はファイルで管理できます。
crontab ファイル・パス
でファイルの内容をcronに登録します。
Rundeck
APIでワークフローを登録することができます。
ワークフローの書式はXMLもしくはYamlです。
既存のジョブ設定をダウンロードすることができるので、初回は既存のジョブをダウンロードして改造すると良いかもしれません。
<joblist>
<job>
<description><![CDATA[# Run remote test3
`test.sh`]]></description>
<dispatch>
<excludePrecedence>true</excludePrecedence>
<keepgoing>false</keepgoing>
<rankOrder>ascending</rankOrder>
<threadcount>1</threadcount>
</dispatch>
<executionEnabled>true</executionEnabled>
<id></id>
<loglevel>INFO</loglevel>
<name>test3</name>
<nodefilters>
<filter>exec.docker1.com</filter>
</nodefilters>
<nodesSelectedByDefault>true</nodesSelectedByDefault>
<notification>
<onfailure>
<plugin type='SlackNotification'>
<configuration>
<entry key='webhook_url' value='https://hooks.slack.com/services/.....' />
</configuration>
</plugin>
</onfailure>
</notification>
<schedule>
<dayofmonth />
<month day='*' month='*' />
<time hour='00' minute='00' seconds='*/10' />
<year year='*' />
</schedule>
<scheduleEnabled>true</scheduleEnabled>
<sequence keepgoing='false' strategy='node-first'>
<command>
<description>testsh</description>
<exec>/var/local/test.sh</exec>
</command>
</sequence>
<uuid></uuid>
</job>
</joblist>
これをちょこちょこ変えてcurl経由で実行します。
curl -H 'X-RunDeck-Auth-Token:XXXXX' \
-H "Content-Type: application/xml" \
-d @/path/to/xml
-X POST
http://rundeck:4440/api/17/project/TestProject2/jobs/import?dupeOption=skip&uuidOption=remove
※ 余談ですがyamlではうまくいきませんでした…ダウンロードしたファイル改造しないとダメなのかな。。。
もっと便利にRundeckからGit連携ができるようですね。
rundeckのプロジェクト情報をgitで管理
まとめ
いかがでしょうか。
cronをRundeckに置き換えるだけで幸せになれそうです。









