2014-07-15 12 views
13

Problem: Mam oświadczenie szefa kuchni, które powinno być wyświetlane tylko wtedy, gdy atrybut jest "prawdziwy". Ale działa za każdym razem.atrybut chef only_if jest równy true

Oczekiwane zachowanie: Gdy default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4 nie powinien być zainstalowany.

Rzeczywiste zachowanie: Bez względu na to, jaki atrybut jest ustawiony, instaluje dotnet4.

Mój kod:

plik atrybut: file

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

przepis:

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

Bardzo podoba mi się format twojego pytania. Jasno zidentyfikowałeś problem, podany wynik i pożądany rezultat. Musisz być inżynierem :) – sethvargo

+1

Tak, jestem, być może możesz nagrodzić go przegłosowaniem ... :) – tbenz9

Odpowiedz

15

Guards które uruchamiają Ruby muszą być zamknięte w bloku {} inaczej szef kuchni spróbuje uruchomić ciąg w domyślnym tłumaczu (zwykle 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 

Sprawdź, czy musisz logiczna true zamiast "true"

również użyć zwykłego nazwę zmiennej (na source) chyba trzeba interpolować innych danych z ciąg cytowanie.

+0

Dzięki za wskazówkę na temat źródła. Zaktualizowałem swój kod. – tbenz9

6

To Ruby warunkowy, więc trzeba użyć bloku do not_if:

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

(Proszę zanotować dodany {}). Można również użyć składni do..end na multilinii warunków:

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

Wreszcie, proszę upewnić się, że wartość jest String "true" a nie wartość true (zobacz różnicę). W Ruby, true jest boolowskim (podobnie jak false), ale "true" jest ciągiem znaków (podobnie jak "foo") Sprawdzanie, czy true == "true" zwróci false.

+0

Mam podobny problem .. Mam '" sync_db ":" true "' w json config oraz w mój przepis na szefa kuchni Nie mogę go uruchomić, dopóki nie sprawdzę, czy 'only_if {sub_site ['sync_db']! = nil}' i usunę go z atrybutów. 'only_if {sub_site ['sync_db'] ==" true "}' lub 'true' nie działa. Dowolny pomysł? – awm

Powiązane problemy