web-dev-qa-db-ja.com

変数がパペットテンプレートでundefかどうかを確認する

変数がパペットテンプレートでundefかどうかを確認する適切な方法は何ですか?

マニフェストでは、変数は次のように定義されています

$myvar = undef

これはテンプレートでどのようにチェックされますか?

次の2つの亜種を見た

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

そして

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

私の場合はどちらも機能しているようですが、特定の場合に最初のアプローチが失敗するのでしょうか。

19
André Keller

Puppetのドキュメント(この回答を執筆している時点)はそれを非常によく説明しています: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365

undeffalseと同じではないため、ifを使用するだけではそれを確認するのに適した方法ではありません。また、変数が定義されているが、値がfalseまたはnilの場合も、単純なifでチェックすることはできません。

これがscope.lookupvar(‘variable’)を使用して:undefまたは:undefined(またはnil)の戻り値をチェックし、undef、またはまったく設定しません。

7
Evgeny

チェックは、変数が定義されていないときに代替が必要かどうかに依存すると思います。

次のルールを使用しています。

必要な変数

テンプレートのレンダリングを検討する前に、パペットスクリプトで変数に期待値が含まれているかどうかを確認します。

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

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

パラメータのタイプを明示的に設定することにより、作業を簡単にすることができます。これにより、タイプの比較や変換が不要になります。

テンプレートに変数を書き込むだけです。

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

定義する必要があるオプションの変数

変数が定義されていると想定すると、ブール値として扱うことができます。

マッピングは次のとおりです( source ):

  • falsey:空の文字列、false、undef
  • truthy:その他すべて

パペット> = 4の場合:

  • falsey:false、undef
  • truthy:その他すべて

例:

@myvarがtrueと評価された場合は「何か」、それ以外の場合は「何か」を出力します。

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

@myvarがtrueと評価された場合に「何か」を出力する

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

trueと評価された場合は@myvarを出力し、それ以外の場合は「代替」%>を出力します

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

定義可能なオプションの変数

変数が定義されているかどうかさえわからず、間違った仮定をしたくない場合は、テンプレートでチェックしてください。

例:

@myvarが定義されていて空ではない場合、「何か」の後に@myvarを出力します

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

@myvarが定義されていて、10より大きい場合に出力します

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

最初のものは魅力のように機能するはずです、それはコースでも教えられていることです。

二つ目は...冗長です。

2
Ger Apeldoorn