Search code examples
rubychef-infralwrp

chef only_if attribute equals true


Problem: I have a chef statement that should only run if the attribute is "true". But it runs every time.

Expected Behavior: When default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4 should not be installed.

Actual Behavior: No matter what the attribute is set to, it installs dotnet4.

My code:

attribute file:

default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false"

recipe file:

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

Solution

  • Guards that run Ruby must be enclosed in a block {} otherwise Chef will try to run the string in the default interpreter (usually 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
    

    Check if you need boolean true instead of "true"

    Also, use the plain variable name (for source) unless you need to interpolate other data with the string quoting.