変数がパペットテンプレートでundefかどうかを確認する適切な方法は何ですか?
マニフェストでは、変数は次のように定義されています
$myvar = undef
これはテンプレートでどのようにチェックされますか?
次の2つの亜種を見た
<% if @myvar -%>
<% end -%>
そして
<% if not @myvar.nil? and @myvar -%>
<% end -%>
私の場合はどちらも機能しているようですが、特定の場合に最初のアプローチが失敗するのでしょうか。
Puppetのドキュメント(この回答を執筆している時点)はそれを非常によく説明しています: https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365
undef
はfalse
と同じではないため、if
を使用するだけではそれを確認するのに適した方法ではありません。また、変数が定義されているが、値がfalse
またはnil
の場合も、単純なif
でチェックすることはできません。
これがscope.lookupvar(‘variable’)
を使用して:undef
または:undefined
(またはnil
)の戻り値をチェックし、undef
、またはまったく設定しません。
チェックは、変数が定義されていないときに代替が必要かどうかに依存すると思います。
次のルールを使用しています。
テンプレートのレンダリングを検討する前に、パペットスクリプトで変数に期待値が含まれているかどうかを確認します。
if $myvar == undef {
fail {"You really must set myvar, seriously."}
}
if ! $anothervar {
fail {"anothervar is false, undefined or empty."}
}
パラメータのタイプを明示的に設定することにより、作業を簡単にすることができます。これにより、タイプの比較や変換が不要になります。
テンプレートに変数を書き込むだけです。
<%= @myvar %>
<%= @anothervar %>
変数が定義されていると想定すると、ブール値として扱うことができます。
マッピングは次のとおりです( source ):
パペット> = 4の場合:
例:
@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 %>
最初のものは魅力のように機能するはずです、それはコースでも教えられていることです。
二つ目は...冗長です。