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
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.
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
.