2013-06-13 16 views
13

Qual è il modo corretto per verificare se una variabile non è undef in un modello burattino?Controlla se una variabile è undef nel modello fantoccio

Nel manifestare la variabile è definito come segue

$myvar = undef 

Come è verificato nel modello?

è Saw seguenti due varianti

<% if @myvar -%> 
<% end -%> 

e

<% if not @myvar.nil? and @myvar -%> 
<% end -%> 

Entrambi sembrano funzionare nel mio caso, ma mi chiedo se il primo approccio non riesce in su determinati casi?

risposta

5

La documentazione Puppet (al momento della stesura di questa risposta) spiega molto bene: https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables

Dal undef non è lo stesso di false, usando solo un if non è un buon modo per verificare la presenza di esso. Anche quando una variabile è definita, ma ha un valore di false o nil, è anche impossibile controllare con un semplice if.

Questo è il motivo che si desidera utilizzare scope.lookupvar(‘variable’) e verificare il suo valore di ritorno per :undef o :undefined (o nil) per sapere se è stato impostato su undef, o non mise mai a tutti.

+1

La pagina puppetlabs è stata spostata in https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables –

+0

Che ne dici del controllo, se è definita una risorsa_? In un manifest di Puppet, farei if (if (defined (File ['/ home/foo'])) '- che dire di erb-templates? –

2

Il primo dovrebbe funzionare come un fascino, è ciò che viene insegnato anche nei corsi.

Il numero due sembra ... ridondante.

+1

Quando il valore di '@ myvar' è' false', non è lo stesso di quando è 'undef'. Quindi la prima variante ignorerà i valori di 'false', non ciò che il subj. sta chiedendo – Evgeny

1

Direi che il controllo dipende dal fatto che si desideri un'alternativa quando la variabile non è definita.

sto usando le seguenti regole:

richiesto variabile

check nello script fantoccio se la variabile contiene il valore atteso prima di considerare anche modello di rendering:

if $myvar == undef { 
    fail {"You really must set myvar, seriously."} 
} 

if ! $anothervar { 
    fail {"anothervar is false, undefined or empty."} 
} 

Si può fare la tua vita più semplice impostando il tipo di parametri in modo esplicito. Questo risparmia i confronti e le conversioni.

Nel modello, è sufficiente scrivere le variabili allora:

<%= @myvar %> 
<%= @anothervar %> 

variabile opzionale che deve essere definito

Se si assume viene definita la variabile, è possibile trattarlo come booleano.

La mappatura è la seguente (source):

  • falsey: stringa vuota, false, undef
  • truthy: tutto il resto

In Puppet> = 4:

  • Falsey: false, undef
  • truthy: tutto il resto

Esempi:

di stampa 'qualcosa' se @myvar vale true, altrimenti 'qualcos'altro'.

<% if @myvar %>something<% else %>something else<% end %> 

di stampa 'qualcosa' se @myvar restituisce true @myvar

<% if @myvar %>something<% end %> 

stampa se si restituisce true, altrimenti% 'alternativa'>

<%= @myvar ? @myvar : 'alternative' %> 

variabile opzionale che può essere definito

Se non si è certi che una variabile sia definita e non si vogliano fare ipotesi errate, ch eck nel modello.

Esempi:

stampa 'qualcosa' seguita da @myvar se @myvar è definito e non vuoti

<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %> 

@myvar di stampa se è definito e maggiore di 10

<%= @myvar if defined?(@myvar) && @myvar > 10 %> 
Problemi correlati