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?
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.
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:
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 %>
Si vous supposez que la variable est définie, vous pouvez la traiter comme booléenne.
Le mappage est le suivant ( source ):
Dans Puppet> = 4:
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' %>
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 %>
Le premier devrait fonctionner comme un charme, c'est aussi ce qui est enseigné dans les cours.
Le numéro deux semble ... redondant.