web-dev-qa-db-ja.com

chef only_if属性がtrueに等しい

問題:属性が「true」の場合にのみ実行するchefステートメントがあります。しかし、それは毎回実行されます。

予想される動作: When default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4はインストールしないでください。

実際の動作:属性の設定に関係なく、dotnet4がインストールされます。

私のコード:

属性ファイル:

default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false"

レシピファイル:

windows_package "dotnet4" do
    only_if node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true'
    source "#{node[:QuickBase_Legacy_Stack][:dotNetFx4_URL]}"
    installer_type :custom
    action :install
    options "/quiet /log C:\\chef\\installLog4.txt /norestart /skipmsuinstall"
end
18
tbenz9

Guards その実行Rubyはブロック{}で囲む必要があります。

windows_package "dotnet4" do
    only_if        { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install] == 'true' }
    source         node[:QuickBase_Legacy_Stack][:dotNetFx4_URL]
    installer_type :custom
    action         :install
    options        "/quiet /log C:\\chef\\installLog4.txt /norestart /skipmsuinstall"
end

"true"の代わりにブール値trueが必要かどうかを確認します

また、文字列引用符で他のデータを補間する必要がない限り、(sourceの)プレーン変数名を使用します。

20
Matt

これはRuby条件付きです。したがって、not_ifにブロックを使用する必要があります。

only_if { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' }

(追加された{}に注意してください)。複数行の条件にdo..end構文を使用することもできます。

only_if do
  node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true'
end

最後に、値がString "true"であり、値trueではないことを確認してください(違いを参照)。 Rubyでは、trueはブール値(falseと同様)ですが、"true"は文字列("foo"と同様)true =かどうかを確認します= "true"falseを返します。

8
sethvargo