在 Puppet 模板中,如何正确检查变量是否为未定义?
在清单文件中,该变量的定义如下:
$myvar = undef
这个在模板中如何检查?
我看到了以下两种变体
<% 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
或从未设置过。
在考虑模板渲染之前,请检查您的 Puppet 脚本是否包含所需变量的预期值:
我认为检查取决于您是否希望在未定义变量时使用替代方法。
if $myvar == undef {
fail {"You really must set myvar, seriously."}
}
if ! $anothervar {
fail {"anothervar is false, undefined or empty."}
}
<%= @myvar %>
<%= @anothervar %>
如果您假设该变量已定义,则可以将其视为布尔值。
映射如下(source):
在Puppet >=4中:
示例:
如果@myvar评估为true,则打印“something”,否则打印“something else”。
<% if @myvar %>something<% else %>something else<% end %>
<% if @myvar %>something<% end %>
如果@myvar为真,则打印@myvar,否则打印“alternative”%>
<%= @myvar ? @myvar : 'alternative' %>
如果您不确定某个变量是否已经定义,并且不想做出错误的假设,请在模板中检查它。
示例:
如果@myvar已定义且非空,则打印'something',然后是@myvar
<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>
如果@myvar被定义且大于10,则打印它。
<%= @myvar if defined?(@myvar) && @myvar > 10 %>
fail()
是一个函数,你必须使用圆括号()
而不是花括号{}
。 - Edward Ned Harvey@myvar
的值为false
时,它与其值为undef
时是不同的。因此,第一种情况将忽略false
的值,而不是主题所要求的内容。 - Evgeny
if (defined(File['/home/foo']))
--那erb模板呢? - Mikhail T.注意:如果一个Puppet变量从未被定义,那么它的值为undef,这意味着它在模板中的值为nil。
- kravietz