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










