Chefのruby_blockを利用してファイル更新時に条件によってログを出力する
March 28, 2014
Chefには冪等性という特徴がありますが、実際の運用では
ミドルウェアの設定の更新はしたいが、ミドルウェアの再起動までは
自分の手で確認したい。という条件もあるかと思います。
- 設定ファイルは常に更新しても良い
- 設定ファイルが更新された時だけミドルウェアを起動したい
- 設定ファイルが更新された時にミドルウェアが起動済みであればログに出力
上記条件を満たすために実施した内容について共有します。
- chef/site-cookbooks/apache/recipes/default.rb
template "/etc/httpd/conf/httpd.conf" do
source "httpd.conf.erb"
owner "www"
mode 0644
notifies :run, "ruby_block[warn]", :immediately
end
ruby_block "warn" do
block do
# httpdが起動中であればログ出力
unless `pgrep httpd` == ""
print <<"EOS"
\e[33m===================================================================
recipe:apache
apacheが起動中です。
新しい設定を反映させるためにはapahceを再起動してください。
===================================================================\e[0m
EOS
end
end
action :nothing
notifies :start, "service[httpd]"
end
service "httpd" do
action :enable
end
/etc/httpd/conf/httpd.conf
が更新されるnotifies :run, "ruby_block[warn]"
でruby_block
を実行ruby_block
内でミドルウェアが起動中かどうかRubyのコードで条件分岐- 起動中であればログを出力
ruby_block
でnotifies :start, "service[httpd]"
を実行、ミドルウェアの起動を行う
ruby_block
は実行順序が最後になるというChefの設計上、
notifies :start, "service[httpd]"
という方法を選択しました。
もう少しマシな方法があれば是非とも教えてください。
Chefは何か込み入ったことをしようとすると色々と工夫しないといけないのが難点ですね。