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 install
とbundle 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を見ながらリモートで実行」「問題なければ即コミット」という点もよかったです
所感
何となくの問題意識とフィーリングで実装を進めていたので「役に立たないツールになるかも…」と戦々恐々としていたのですが、今日実際にプロダクションで使ってみて、少なくとも僕自身には結構よさげなツールでした。
というわけで人柱絶賛募集中ですので、興味のあるかたはどうぞご利用ください。