バツイチとインケンのエンジニアブログ
プログラムやプログラムじゃないこと

ジョブ・スケジューラ Rundeck で高機能 cron を実現する

2016-10-18
書いた人 : バツイチ
カテゴリ : スケジューラ | タグ : Rundeck, スケジューラ

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でスケジュールの登録を行います。

rundeck_schedule2

cronに似た書式で、秒単位まで指定できます。
(cronは分単位が最小)

rundeck_schedule1

書式知らなくても設定できるインターフェイスも用意されています。

コマンドの実行

cron

ローカルでコマンドを実行します。
コマンドもcrontabで書きます。

Rundeck

ローカルで実行するかリモートで実行するか、
コマンドを実行するかスクリプトを実行するか
様々な選択肢があります。
更に、ジョブ同士に依存関係を持たせてワークフローを構築することができます。

rundeck_workflow

当然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_history

Rundeckでは実行履歴が管理されており、Web GUI上から閲覧できます。
リンクをタップすれば詳細も見れます。

実行結果はどんどん増えていくので、放置するとCPUがリークします。
RDBにインデックス張りましょう。。。
参考: Rundeck との闘争 | 日々是ウケ狙い

スケジュール外実行

cron

スケジュールと関係なく実行したいとき、cronだとcrontab -lでコマンドを表示して、コピペして実行・・・のようなことするのが多いのではないでしょうか。

Rundeck

Rundeckだったら登録済みのジョブはボタンぽちでいつでも実行できます。

rundeck_runjob

タイプミス、コピペミスすることがないですし、cron実行時の書式とターミナルから実行時の書式が違う問題*に出くわすこともありません。

cron書式と実行書式が異なる例)

cron   : date +”\%Y\%m\%d
ターミナル: date +”%Y%m%d
※ cronでは%のエスケープが必要なのです。

通知

cron

cronはデフォルトでメール通知がくるようになっています。
スクリプト内でいろいろ書けばその他の通知も可能ですが、仕組みとしてはメール通知以外にありません。

Rundeck

Rundeckはデフォルトでメール通知とWebhook、プラグインでSlack通知などが行なえます。

rundeck_noti

Slack連携を行うとこんな通知がくるようになります。

rundeck_slack

High Availability

cron

cronにはHAなどありません。
サーバが死んだらcron設定も飛びます。

Rundeck

RundeckはHA構成を組むことができます。
(クラスタではなくactive-standbyですが)

rundeck_execution

完全なHA構成の構築方法は後ほど別の記事に書きます。

ワークフローのファイル管理

複数人でワークフローを作成したり閲覧したりする場合にはやはりGitでリポジトリ管理したくなります。

cron

実は設定はファイルで管理できます。
crontab ファイル・パス
でファイルの内容をcronに登録します。

Rundeck

APIでワークフローを登録することができます。
ワークフローの書式はXMLもしくはYamlです。
既存のジョブ設定をダウンロードすることができるので、初回は既存のジョブをダウンロードして改造すると良いかもしれません。

rundeck_download

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

このエントリーをはてなブックマークに追加
Tweet

← JVMチューニング: G1GCの使いどころとCMS GCからのマイグレート
RustのWebフレームワークIronでWebサービスをつくる →

 

最近書いた記事

  • Ryzen7 3800XT でmini ITXオープンフレームPCを作る
  • Pythonで機械学習入門 競馬予測
  • HP ENVY 15 クリエイターモデルレビューとRAID0解除
  • JRA-VAN データラボを使って、競馬データを収集する
  • Surface Pro 3 にubuntu18.04を入れる

カテゴリー

  • Android
  • Apache Flink
  • API
  • AWS
  • bazel
  • BigQuery
  • Cassandra
  • Docker
  • Druid
  • Elasticsearch
  • Git
  • Golang
  • gradle
  • HDFS
  • JavaScript
  • jvm
  • Linux
  • MongoDB
  • MySQL
  • Nginx
  • Nodejs
  • PaaS
  • PHP
  • Python
  • RabbitMQ
  • Raspberry Pi
  • React Native
  • Redis
  • Riak
  • rust
  • scala
  • Scheme
  • SEO
  • solr
  • Spark
  • spray
  • Sublime Text
  • Swift
  • Tableau
  • Unity
  • WebIDE
  • Wordpress
  • Youtube
  • ひとこと
  • カンファレンス
  • スケジューラ
  • マイクロマウス
  • 広告
  • 技術じゃないやつ
  • 株
  • 機械学習
  • 競馬
  • 自作キーボード
  • 自然言語処理

アーカイブ

  • 2021年4月
  • 2021年2月
  • 2021年1月
  • 2020年3月
  • 2020年2月
  • 2020年1月
  • 2019年10月
  • 2019年9月
  • 2019年8月
  • 2019年7月
  • 2019年6月
  • 2019年5月
  • 2019年4月
  • 2019年2月
  • 2019年1月
  • 2018年12月
  • 2018年11月
  • 2018年9月
  • 2018年5月
  • 2018年3月
  • 2018年2月
  • 2017年9月
  • 2017年8月
  • 2017年6月
  • 2017年4月
  • 2017年3月
  • 2017年1月
  • 2016年10月
  • 2016年9月
  • 2016年8月
  • 2016年6月
  • 2016年5月
  • 2016年4月
  • 2016年3月
  • 2016年2月
  • 2016年1月
  • 2015年12月
  • 2015年11月
  • 2015年10月
  • 2015年9月
  • 2015年8月
  • 2015年6月
  • 2015年5月
  • 2015年2月
  • 2015年1月
  • 2014年12月
  • 2014年11月
  • 2014年9月
  • 2014年6月
  • 2014年5月
  • 2014年3月
  • 2014年2月
  • 2014年1月
  • 2013年12月
  • 2013年11月
  • 2013年10月
  • 2013年9月
  • 2013年8月

書いた人

  • バツイチちゃん
  • インケンくん

このブログについて

エンジニアとしての考え方が間逆な2人がしょーもないこと書いてます。

バツイチ

アイコン

IT業界で働くエンジニアです。名前の通りバツイチです。
理論や抽象的概念が好きだけど人に説明するのが下手。

インケン

アイコン

バツイチちゃんと同じ業界で働いています。
理論とか開発手法とかは正直どうでもよくて、
生活する上で役に立つことに使いたい

Copyright 2025 バツイチとインケンのエンジニアブログ