18

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

予想される動作: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
4

2 に答える 2

20

Ruby を実行するGuardはブロックで囲む必要があります。{}そうしないと、Chef はデフォルトのインタープリター (通常は bash) で文字列を実行しようとします。

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また、文字列の引用符で他のデータを補間する必要がない限り、プレーンな変数名 ( for ) を使用してください。

于 2014-07-15T16:34:45.847 に答える
8

これは 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

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

于 2014-07-15T16:34:09.023 に答える