在木偶模板中检查变量是否为undef的正确方法是什么?
在清单中,变量定义如下
$myvar = undef
Run Code Online (Sandbox Code Playgroud)
如何在模板中检查?
是看到以下两个变种
<% if @myvar -%>
<% end -%>
Run Code Online (Sandbox Code Playgroud)
和
<% if not @myvar.nil? and @myvar -%>
<% end -%>
Run Code Online (Sandbox Code Playgroud)
它们似乎都适用于我的情况,但我想知道第一种方法在某些情况下是否失败?
Puppet文档(在撰写本回答时)解释得非常好:https: //docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables
由于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."}
}
Run Code Online (Sandbox Code Playgroud)
通过显式设置参数类型,您可以让您的生活更轻松。这可以节省您的类型比较和转换。
在您的模板中,您只需编写变量,然后:
<%= @myvar %>
<%= @anothervar %>
Run Code Online (Sandbox Code Playgroud)
如果您假设变量已定义,则可以将其视为布尔值。
映射如下(来源):
在人偶 >=4 中:
例子:
如果@myvar 评估为真,则打印“某事”,否则打印“其他”。
<% if @myvar %>something<% else %>something else<% end %>
Run Code Online (Sandbox Code Playgroud)
如果@myvar 评估为真,则打印“某物”
<% if @myvar %>something<% end %>
Run Code Online (Sandbox Code Playgroud)
如果计算结果为真,则打印 @myvar,否则为 'alternative' %>
<%= @myvar ? @myvar : 'alternative' %>
Run Code Online (Sandbox Code Playgroud)
如果您不确定某个变量是否已定义并且不想做出错误假设,请在模板中检查它。
例子:
如果@myvar 已定义且不为空,则打印“something”后跟@myvar
<% if defined?(@myvar) && ! @myvar.empty? %>something<%= @myvar %><% end %>
Run Code Online (Sandbox Code Playgroud)
如果已定义且大于 10,则打印 @myvar
<%= @myvar if defined?(@myvar) && @myvar > 10 %>
Run Code Online (Sandbox Code Playgroud)