daemontoolsなserviceをハンドリングするための Chef::Provider::Service::Daemontools を書いてみました

Chefでdaemontools配下のサービスをハンドリングするときは、コミュニティクックブックの daemontools を使ってる人が多いと思います。

こんな感じで。

daemontools_service "tinydns-internal" do
  directory "/etc/djbdns/tinydns-internal"
  template false
  action [:enable,:start]
end

notification も送れます。

template '...' do
  ...
  notifies :restart, 'daemontools_service[tinydns-internal]'
end

自分もこれを使おうと思ったのですが、いくつか不満点がありました

  • serviceとdaemontools_serviceの両対応のレシピを書く場合、
    • service と daemontools_service とでほぼ同じ記述をしないといけない
    • notifies を送る側でも service か daemontools_service か意識しないといけない
  • action :stop で svc -p (SIGSTOP) している
    • なんで svc -d (SIGTERM) じゃないんでしょうか。。。
  • サービスのハンドリングだけしたいので、daemontools のインストールとかは別に要らない
    • 依存で ucspi-tcp もインストールされるが使ってないので要らない
    • RedHat系だと "daemontools" という名前のパッケージを入れようとするが、(内部のyum reposにある)"daemontools-toaster" を入れたい
      • attribute によるパッケージ名の変更はできない
  • run ファイルの生成機能は別に要らない(あっても使わなければいいだけだけど)


ので、service リソース (http://docs.opscode.com/resource_service.html) の provider として指定可能な Chef::Provider::Service::Daemontools を書いてみました。

gem install chef-provider-service-daemontools でインストールして、こんな感じで使えます。

require 'chef/provider/service/daemontools'

template '...' do
  ...
  notifies :restart, 'service[oreno-daemon]'
end

service 'oreno-daemon' do
  provider Chef::Provider::Service::Daemontools
  service_dir '/service'
  directory '/usr/oreno/daemon/oreno-daemon'
  supports :restart => true, :reload => true
  action [:enable, :start]
end
  • provider: 「provider Chef::Provider::Service::Daemontools」は必須です
  • service_dir: svscanが監視しているディレクトリです。この下にsymlinkが作られます。デフォルトは /service です
  • directory: symlinkが指すrunファイル等があるディレクトリです。デフォルトは /usr/oreno/daemon/#{service_name} です

notifies でも既存の service と同じように 「service[oreno-daemon]」 と指定できるのがミソです。

Special thanks!

daemontools.rb を書くにあたり、ルビーカの低い自分を [twitter:@niku4i] さんと [twitter:@sonots] さんに助けていただきました! あざっっっっっっっっっっっっっす!!!