Chefのruby_blockを利用してファイル更新時に条件によってログを出力する
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は何か込み入ったことをしようとすると色々と工夫しないといけないのが難点ですね。