厨师(Chef)only_if属性等于true

18

问题:我有一条 Chef 语句,只有在属性为“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

2
我非常喜欢你的问题格式。你清楚地识别了问题,给出了结果和期望的结果。你一定是个工程师 :) - sethvargo
1
是的,我是。也许你可以用一个赞来奖励一下我... :) - tbenz9
2个回答

20

在 Ruby 中运行的 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)。


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

我遇到了类似的问题。在我的 json 配置文件中,我有 "sync_db": "true",但是在我的 chef recipe 中,除非我检查 only_if { sub_site['sync_db'] != nil } 并从属性中删除它,否则不起作用。only_if {sub_site['sync_db'] == "true"} 或者true 都不行。有什么想法吗? - awm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接