检查 Puppet 模板中的变量是否为未定义。

22

在 Puppet 模板中,如何正确检查变量是否为未定义?

在清单文件中,该变量的定义如下:

$myvar = undef

这个在模板中如何检查?

我看到了以下两种变体

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

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

它们两个都在我的情况下似乎都有效,但我想知道第一种方法是否在某些情况下会失败?

3个回答

9

在撰写此答案时,Puppet文档已经很好地解释了这个问题:https://puppet.com/docs/puppet/latest/lang_template_erb.html#concept-5365

由于undeffalse并不相同,仅使用if语句检查它并不是一个好的方法。当变量被定义但值为falsenil时,使用简单的if语句也无法检查。

这就是为什么要使用scope.lookupvar('variable')来检查其返回值是否为:undef:undefined(或nil),以了解它是否被设置为undef或从未设置过。


1
Puppetlabs网页已经迁移到https://docs.puppet.com/puppet/latest/reference/lang_template_erb.html#testing-for-undefined-variables。 - Slaven Rezic
如何检查是否定义了一个“资源”?在Puppet清单中,我会这样做:if (defined(File['/home/foo']))--那erb模板呢? - Mikhail T.
1
欢迎来到URL持久化。现在是2019年,你猜怎么着?URL又变了 :) https://puppet.com/docs/puppet/6.4/lang_template_erb.html#concept-5365 现在它说:注意:如果一个Puppet变量从未被定义,那么它的值为undef,这意味着它在模板中的值为nil。 - kravietz

7
我会根据以下规则进行翻译:

必需的变量

在考虑模板渲染之前,请检查您的 Puppet 脚本是否包含所需变量的预期值:

我认为检查取决于您是否希望在未定义变量时使用替代方法。

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 >=4中:

  • falsey: false,undef
  • truthy: 其他所有内容

示例:

如果@myvar评估为true,则打印“something”,否则打印“something else”。

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

如果@myvar为真,则打印“something”。
<% 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

2
第一个应该能完美地工作,这也是课程中所教授的。
第二个似乎有些多余。

1
@myvar的值为false时,它与其值为undef时是不同的。因此,第一种情况将忽略false的值,而不是主题所要求的内容。 - Evgeny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接