检查puppet模板中的变量是否为undef

时间:2013-06-13 20:56:33

标签: erb puppet

在木偶模板中检查变量是否为undef的正确方法是什么?

在清单中,变量定义如下

$myvar = undef

如何在模板中检查?

看到以下两个变种

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

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

它们似乎都适用于我的情况,但我想知道第一种方法是否在某些情况下失败了?

3 个答案:

答案 0 :(得分:7)

Puppet文档(在撰写本答案时)解释得非常好:https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365

由于undeffalse不同,因此仅使用if不是检查它的好方法。此外,当定义变量但值为falsenil时,也无法使用简单的if进行检查。

这就是为什么您要使用scope.lookupvar(‘variable’)并检查其:undef:undefined(或nil)的返回值,以了解它是否设置为{{1或者永远不会设置。

答案 1 :(得分:3)

我说检查取决于在未定义变量时是否需要替代方案。

我使用以下规则:

必需变量

在考虑模板渲染之前,检查您的木偶脚本中变量是否包含预期值:

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 :其他一切

在Puppet&gt; = 4:

  • falsey :false,undef
  • truthy :其他一切

<强>示例:

打印&#39;某些东西&#39;如果@myvar评估为真,否则&#39;其他内容&#39;。

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

打印&#39;某些东西&#39;如果@myvar评估为真

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

如果评估为真,则打印@myvar,否则&#39;替代&#39; %GT;

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

可定义的可选变量

如果您不确定变量是否已定义且不想做出错误的假设,请在模板中进行检查。

<强>示例:

打印&#39;某些东西&#39;如果@myvar已定义且不为空,则为@myvar

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

打印@myvar,如果已定义且大于10

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

答案 2 :(得分:2)

第一个应该像魅力一样工作,这也是课程中教授的内容。

第二号似乎......多余。