web-dev-qa-db-ja.com

Chefにフォルダーが存在するかどうかを確認するにはどうすればよいですか?

これは私のコードです:

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

それは常にファイルが存在することを示し、ループを実行します。

12
Sony Koithara

ここでは シェフガード を使用する必要があります。ガードは条件付き実行を指定しますが、リソースをリソースコレクションに挿入します。あなたの例と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_evaled、ラッピング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
27
sethvargo

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
6
jtblin