chefで頑張って冪等性を確保する

packageリソースなどは、勝手に冪等になってくれるけど、executeとかは自分で冪等になるように書かないといけない。

特定の文字列を、ファイルの末尾に追記したい場合

例:/etc/resolv.conf に 'options single-request-reopen' を追加する。 二重に追加されないように not_if で制限する。

execute 'add single-request-reopen' do
    command "echo 'options single-request-reopen' >> /etc/resolv.conf"
    not_if "cat /etc/resolv.conf | grep 'options single-request-reopen'"
end

パスを通す場合

例:rbenvコマンドにパスを通す。 パスが通っている場合は not_if で制限する。

user = 'vagrant'
home_dir = "/home/#{user}"
execute 'export path' do
    not_if 'which rbenv'
    user user
    group user
    command <<-EOC
        echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> #{home_dir}/.bash_profile
        echo 'eval "$(rbenv init -)"' >> #{home_dir}/.bash_profile
    EOC
end

とりあえず、このへんを知っておくと、たいていは冪等に書けるんじゃないかと。