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に置き換えるだけで幸せになれそうです。