web-dev-qa-db-fra.com

l'attribut chef only_if est égal à true

Problème: J'ai une instruction chef qui ne doit s'exécuter que si l'attribut est "true". Mais cela fonctionne à chaque fois.

Comportement attendu: Lorsque default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4 ne doit pas être installé.

Comportement réel: Quel que soit l'attribut défini, il installe dotnet4.

Mon code:

fichier d'attribut:

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

fichier de recette:

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
18
tbenz9

Gardes qui s'exécutent Ruby doit être enfermé dans un bloc {} sinon Chef essaiera d'exécuter la chaîne dans l'interpréteur par défaut (généralement 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

Vérifiez si vous avez besoin d'un booléen true au lieu de "true"

Utilisez également le nom de variable simple (pour source), sauf si vous devez interpoler d'autres données avec la chaîne entre guillemets.

20
Matt

C'est un Ruby conditionnel, vous devez donc utiliser un bloc pour votre not_if:

only_if { node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true' }

(Veuillez prendre note des {}). Vous pouvez également utiliser le do..end syntaxe pour les conditions multilignes:

only_if do
  node[:QuickBase_Legacy_Stack][:dotNetFx4_Install]=='true'
end

Enfin, assurez-vous que votre valeur est bien la chaîne "true" et non la valeur true (voir la différence). Dans Ruby, true est un booléen (tout comme false), mais "true" est une chaîne (tout comme "foo") Vérification si true == "true" renverra false.

8
sethvargo