これは私のコードです:
if !::File.exist?("#{node['iis']['home']}\\backup\\BkpB4Chef")
windows_batch "Backup IIS Config" do
code <<-EOH
"#{node['iis']['home']}"\\appcmd add backup BkpB4Chef
EOH
end
end
それは常にファイルが存在することを示し、ループを実行します。
ここでは シェフガード を使用する必要があります。ガードは条件付き実行を指定しますが、リソースをリソースコレクションに挿入します。あなたの例とjtblinの答えでは、リソースはコレクションに追加されません(これについては後で少し詳しく説明します)。
ここにあなたが始めるためのいくつかの作業コードがあります:
windows_batch "Backup IIS Config" do
code %Q|#{node['iis']['home']}"\\appcmd add backup BkpB4Chef|
not_if { ::File.directory?("#{node['iis']['home']}\\backup\\BkpB4Chef") }
end
creates
の使用べき等でないChefリソースの多くは、creates
パラメータもサポートします。これは、リソースの機能を説明します。言い換えれば、windows_batch
"作成"。これは、ファイル、ディレクトリ、または実行可能ファイルです。したがって、次のコードは前の回答と同等です。
windows_batch "Backup IIS Config" do
code %Q|#{node['iis']['home']}"\\appcmd add backup BkpB4Chef|
creates"#{node['iis']['home']}\\backup\\BkpB4Chef"
end
not_if
対条件付きラッパーChefは、コンパイルフェーズと収束フェーズの2つのフェーズで実行されます。コンパイルフェーズでは、レシピが評価され、リソースがリソースコレクションに追加されます。収束フェーズでは、リソースコレクション内のリソースが実行され、ターゲットシステムに対して評価されます。したがって、次の例を検討してください。
if false
service 'foo' do
action :start
end
end
これは、いくつかの条件に基づいてサービスを開始する、かなり単純なレシピです。ただし、コンパイルフェーズの最後では、service
リソースはリソースコレクションに追加されません。レシピDSLはinstance_eval
ed、ラッピングif false
条件付きは、Ruby VMによってコードが読み取られることを防ぎます。つまり、そのサービスは存在しないようです。
リソースに通知することはかなり一般的です。レシピの後半で、構成の変更のためにApacheを再起動したい場合があります。これを行う「適切な」方法は、通知を使用することです。
template '/var/www/conf.d/my.conf.file' do
# ...
notifies :restart, 'service[Apache2]'
end
このtemplate
は、リソースコレクションに存在しないため、サービスリソースに適切に通知できません。したがって、このレシピは失敗します。些細な例のようですが、条件付きif false
をノード属性テストに:
if node['cookbook']['use_Apache']
service 'Apache2' do
action :start
end
end
クックブックに50%の確率で機能する二分法を作成しました。残念ながら、ほとんどのクックブックは2つのリソースよりもはるかに複雑であるため、リソースが存在しないリソースに通知できるEdgeのケースの数は、複雑さとともに大幅に増加します。これは、リソースガードを使用してすべて解決可能です(正しい動作を示します)。
service 'Apache2' do
action :start
only_if { node['cookbook']['use_Apache'] }
end
Dir.exists?
を使用します。 if ! condition
を少し読みやすいunless condition
に置き換えることもできます。
unless Dir.exist? "#{node['iis']['home']}\\backup\\BkpB4Chef"
windows_batch "Backup IIS Config" do
code <<-EOH
"#{node['iis']['home']}"\\appcmd add backup BkpB4Chef
EOH
end
end