読者です 読者をやめる 読者になる 読者になる

Cronicleというツールを作ってみた

Cronicleというツールを作りました。

http://cronicle.codenize.tools/

これは何?

なんでしょうね…ジョブオンデマンド実行・定期実行管理ツール? 名前から分かるとおりcronの管理ツールなんですが、オンデマンド実行も普通にできます。 目指したのは簡易版Rundeckです。

使い方

まず、以下のようなDSLでジョブを定義します。

$ cat Jobfile # -fオプションで任意のファイル名
on servers: 'server1' do
  job :my_job, user: "ec2-user", schedule: "* * * * *" do
    puts "hello"
  end
end

それからコマンドラインcronicleコマンドを実行します。

execサブコマンドでオンデマンド実行。

$ cronicle exec my_job
my_job on server1/ec2-user> Execute job
my_job on server1/ec2-user> hello

applyサブコマンドでcrontabを設定。

$ cronicle apply
my_job on server1/ec2-user> Create job: schedule="* * * * *"

$ ssh your_hostname 'crontab -l'
* * * * * /var/lib/cronicle/libexec/ec2-user/my_job 2>&1 | logger -t cronicle/ec2-user/my_job

Ruby以外のジョブ

文字列を直接指定すればRuby以外のジョブを定義できます。

on servers: 'server1' do
  job :my_job2, user: "ec2-user", schedule: "* * * * *", content: <<-EOS
    #!/bin/sh
    echo hello
  EOS
end

bundlerを使う

jobメソッド:bundleキーを渡すと、適当にGemfileを生成してbundle installbundle execを実行してくれます。

on servers: 'server1' do
  job :my_job, user: "ec2-user", schedule: "* * * * *", bundle: 'hashie' do
    require 'hashie'
    mash = Mash.new
  end
end

ホストを指定する

ホストの指定は配列でも可能です。

on servers: ['server1', 'server2'] do
  ...
end

あと別途、ホストリストを渡してあげると

cronicle -h 'server1,server2' apply

正規表現でも指定可能になります。

on servers: /server\d+/ do
  ...
end

さらに以下のようなロール付きのホストリストを渡すと

{
  "servers": {
    "server1": ["web", "app"],
    "server2": ["db"]
  }
}
{
  "roles": {
    "web": ["server1"],
    "app": ["server1"],
    "db": ["server2"]
  }
}

ロール名でホスト指定できます。

on roles: "web" do # use role
  ...
end

それcapistranoで(ry

ユースケースは結構かぶりそうなんですが、むこうはcronの設定はできないので異なる部分も多いかなと。

あと、見ての通りジョブの定義はスクリプトそのままです。

それChefで/Puppetで/Itamaeで(ry

システム構成管理ツールとの差異はけっこうもやもやしてて「Itamaeでいいんじゃないかなぁ…」と思っていたんですが、使ってみて以下のような違いがあると考えました。

  • 不特定多数への多数のサーバ設定の定義
    • システム構成管理ツールだと「ロール」でくくった特定多数のサーバ設定はやりやすいんですが「このサーバだけ」とか「一時的にこれらのサーバだけ」みたいなのはやりにくいかなと
    • かといって野良cronはいやですしお寿司
  • 処理内容へのフォーカス
    • Puppetを使う場合だと「フォルダ掘って」「gemをインストールして」「ファイルを定義して」「crontab定義して」とちまちまとやることがあるんですが、cronicleはそのへんよきに計らってくれるので「俺はこのスクリプトが(定期)実行されればいいんだー!」という向きにはよさげです
  • トライアンドエラーによるスクリプトの定義
    • execサブコマンドでリモートホストで実行しながらジョブを定義できるので、さくさく感がよいです
    • また、gitの作業ディレクトリで作業できるので「diffを見ながらリモートで実行」「問題なければ即コミット」という点もよかったです

所感

何となくの問題意識とフィーリングで実装を進めていたので「役に立たないツールになるかも…」と戦々恐々としていたのですが、今日実際にプロダクションで使ってみて、少なくとも僕自身には結構よさげなツールでした。

f:id:winebarrel:20150211214746j:plain

というわけで人柱絶賛募集中ですので、興味のあるかたはどうぞご利用ください。