chef only_if属性等于true

tbe*_*nz9 18 ruby chef-infra lwrp

问题:我有一个厨师声明,只有在属性为"true"时才能运行.但它每次都会运行.

预期行为:default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false"dotnet4不应安装.

实际行为:无论属性设置为什么,它都会安装dotnet4.

我的代码:

属性文件:

default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false"
Run Code Online (Sandbox Code Playgroud)

食谱文件:

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
Run Code Online (Sandbox Code Playgroud)

Mat*_*att 20

运行Ruby的警卫必须包含在一个块中,{}否则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
Run Code Online (Sandbox Code Playgroud)

检查是否需要布尔值true而不是"true"

此外,使用普通变量名称(for source),除非您需要使用字符串引用插入其他数据.


set*_*rgo 8

这是一个Ruby条件,所以你需要使用一个块来not_if:

only_if { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' }
Run Code Online (Sandbox Code Playgroud)

(请注意添加的内容{}).您还可以使用do..end多行条件的语法:

only_if do
  node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true'
end
Run Code Online (Sandbox Code Playgroud)

最后,请确保您的值是字符串"true"而不是值true(请参阅差异).在Ruby中,true是一个布尔值(就像false),但是"true"是一个字符串(就像"foo")检查是否true== "true"将返回false.