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

stop したり init スクリプトを削除したりすると apache2 cookbook なんかが仕込む delayed な reload アクションがこけて converge 全体が失敗する

Chef

また Chef のしょうもない話で恐縮なのですが、表題のようなことに悩んでおりました。

実はこれ、単に次の起動時に立ち上がってきて欲しくないという要求から始まったもので、それだけなら stop も削除もせず、立ち上げたまま chkconfig off でも service リソースで止めるでもしておくだけでいいわけですが、なんかこー…勝手に上がって欲しくないときって、あらかじめ明示的に止めたいじゃないですか、私の手で。特に docker なんかだと supervisord 使いたいじゃないですか。使わない(使って欲しくない)のが明らかなら upstart の config ファイルや init ファイルも消したい……はやり過ぎかもしれませんが、そういうときにどうするかっていうのを

delayed されたものをキャンセルしてえー

とか結構長いこと悩んで放置していたのですが、どこだったか誰かのレシピ見てて

あ…… web_app リソースの後に stop する delayed なアクションをセットするんだ……

という学びがあった次第です。

web_app 'oogatta' do
  docroot   /var/www/oogatta
  server_name    'oogatta'
end

bash 'cleanup_services' do
  code <<-EOH
    if [[ -e /etc/init.d/httpd ]]; then
      service httpd stop
      chkconfig httpd off
      pkill httpd
    fi
  EOH
  action :nothing
end

log 'set cleanup timer' do
  level    :info
  notifies :run, 'bash[cleanup_services]', :delayed
end

気がついてみると実に当たり前ですね。