问题:我有一个厨师声明,只有在属性为" 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
答案 0 :(得分:20)
Guards必须包含在块{}
中,否则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
),除非您需要使用字符串引号插入其他数据。
答案 1 :(得分: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
== {{ 1}}将返回"true"
。