web-dev-qa-db-fra.com

Vérifiez si une variable n'est pas définie dans le modèle de marionnette

Quelle est la bonne façon de vérifier si une variable n'est pas définie dans un modèle de marionnette?

Dans le manifeste, la variable est définie comme suit

$myvar = undef

Comment est-ce vérifié dans le modèle?

Est vu les deux variantes suivantes

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

et

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

Ils semblent tous les deux fonctionner dans mon cas, mais je me demande si la première approche échoue dans certains cas?

19
André Keller

La documentation Puppet (au moment de la rédaction de cette réponse) l'explique très bien: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365

Puisque undef n'est pas la même chose que false, le simple fait d'utiliser un if n'est pas un bon moyen de le vérifier. De plus, lorsqu'une variable est définie, mais a une valeur de false ou nil, il est également impossible de vérifier avec un simple if.

C'est pourquoi vous souhaitez utiliser scope.lookupvar(‘variable’) et vérifier sa valeur de retour pour :undef ou :undefined (ou nil) pour savoir s'il a été défini sur undef, ou jamais défini du tout.

7
Evgeny

Je dirais que la vérification dépend de si vous voulez une alternative lorsque la variable n'est pas définie.

J'utilise les règles suivantes:

Variable obligatoire

Vérifiez dans votre script de marionnette si la variable contient la valeur attendue avant même de considérer le rendu du modèle:

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

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

Vous pouvez vous simplifier la vie en définissant explicitement le type de paramètres. Cela vous épargne des comparaisons et des conversions.

Dans votre modèle, vous écrivez simplement les variables puis:

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

Variable facultative qui doit être définie

Si vous supposez que la variable est définie, vous pouvez la traiter comme booléenne.

Le mappage est le suivant ( source ):

  • falsey: chaîne vide, false, undef
  • véridique: tout le reste

Dans Puppet> = 4:

  • falsey: faux, indéfini
  • véridique: tout le reste

Exemples:

affiche "quelque chose" si @myvar est évalué comme vrai, sinon "autre chose".

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

afficher "quelque chose" si @myvar est évalué comme vrai

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

affiche @myvar s'il vaut true, sinon 'alternative'%>

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

Variable facultative pouvant être définie

Si vous n'êtes pas sûr qu'une variable est même définie et que vous ne voulez pas faire de fausses hypothèses, vérifiez-la dans le modèle.

Exemples:

affiche "quelque chose" suivi de @myvar si @myvar est défini et n'est pas vide

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

affiche @myvar s'il est défini et supérieur à 10

<%= @myvar if defined?(@myvar) && @myvar > 10 %>
4
Hubert Grzeskowiak

Le premier devrait fonctionner comme un charme, c'est aussi ce qui est enseigné dans les cours.

Le numéro deux semble ... redondant.

2
Ger Apeldoorn