2014-07-15 11 views
13

Problema: Ho una dichiarazione dello chef che deve essere eseguita solo se l'attributo è "true". Ma corre ogni volta.attributo chef only_if uguale a vero

Comportamento previsto: Se non è possibile installare default[:QuickBase_Legacy_Stack][:dotNetFx4_Install] = "false" dotnet4.

Comportamento effettivo: Indipendentemente dall'attributo impostato, installa dotnet4.

Il mio codice:

file di attributi: il file

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

ricetta:

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

Mi piace molto il formato della tua domanda. Hai identificato chiaramente il problema, il risultato e il risultato desiderato. Devi essere un ingegnere :) – sethvargo

+1

Sì, lo sono, forse puoi premiarlo con un upvote ... :) – tbenz9

risposta

15

Guards che esegue Ruby deve essere racchiuso in un blocco {} altrimenti Chef tenterà di eseguire la stringa nell'interprete predefinito (in genere 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 

Verificare se è necessario booleano true invece di "true"

Inoltre, utilizzare il nome della variabile pianura (per source) a meno che non avete bisogno di interpolare altri dati con la stringa citando.

+0

Grazie per il suggerimento sulla fonte. Ho aggiornato il mio codice. – tbenz9

6

Questo è un rubino condizionale, quindi è necessario utilizzare un blocco per il vostro not_if:

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

(Si prega di prendere nota del {} aggiunto). È inoltre possibile utilizzare la sintassi do..end per le condizioni di multilinea:

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

Infine, si prega di assicurarsi che il valore è la stringa "true" e non il valore true (vedere la differenza). In Ruby, true è un valore booleano (proprio come false), ma "true" è una stringa (proprio come "foo") Verifica se true == "true" restituirà false.

+0

Sto avendo un problema simile .. Ho '" sync_db ":" true "' in json config e in la ricetta del mio chef non riesco a farla funzionare a meno che non verifichi se 'only_if {sub_site ['sync_db']! = nil}' e rimuoverlo dagli attributi. 'only_if {sub_site ['sync_db'] ==" true "}' or 'true' non funziona. Qualche idea? – awm