Chefのnot_ifとonly_if

Chefのレシピで

/etc/httpd/conf.d/userdir.conf
が存在する場合のみ、ファイル中の文字を全てコメントアウトしたい。

というレシピを作成する場合の話し。


このファイルはApache2.4系から追加されたようで、2.2系が入っているサーバーでChefを動かすと
そんなファイル無いぞとエラーになってしまいます。
ので以下のようにファイルの有無を見てコマンドが実行されるようにしてみました。

「not_if」「only_if」の動作のおさらい

not_if 条件が真でない場合コマンドを実行する
only_if 条件が真の場合コマンドを実行する


今回の例に置き換える

not_if 既にファイルが存在している場合コマンドを実行しない
only_if 既にファイルが存在している場合コマンドを実行する


今回の例では
ファイルが存在している場合、ファイル内を全てコメントアウトしたい(レシピを適用したい)ので
only_ifのほうが合っています。

実際のレシピ

ファイルが存在する場合のみコメントアウトするように書いてみました。

bash "comment out userdir" do
  only_if { File.exists?("/etc/httpd/conf.d/userdir.conf") }
  code <<-EOC
    sed -i "s/^#*/#/g" /etc/httpd/conf.d/userdir.conf
  EOC
end