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),除非您需要使用字符串引用插入其他数据.
这是一个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.