daemontoolsなserviceをハンドリングするための Chef::Provider::Service::Daemontools を書いてみました
Chefでdaemontools配下のサービスをハンドリングするときは、コミュニティクックブックの daemontools を使ってる人が多いと思います。
- https://supermarket.getchef.com/cookbooks/daemontools
- https://github.com/opscode-cookbooks/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 を書いてみました。
- https://rubygems.org/gems/chef-provider-service-daemontools
- https://github.com/hirose31/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] さんに助けていただきました! あざっっっっっっっっっっっっっす!!!