Подтвердить что ты не робот

Атрибут chef only_if равен true

Проблема: У меня есть инструкция 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
4b9b3361

Ответ 1

Guards, которые запускают 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

Проверьте, нужно ли вам boolean true вместо "true"

Кроме того, используйте имя простой переменной (для source), если вам не нужно интерполировать другие данные со строковым цитированием.

Ответ 2

Это условие 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.