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

And*_*ler 18 erb puppet

在木偶模板中检查变量是否为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)

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

Evg*_*eny 7

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或根本不设置的原因.


Hub*_*iak 6

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

我正在使用以下规则:

必需变量

在考虑模板渲染之前,请检查您的 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)

必须定义的可选变量

如果您假设变量已定义,则可以将其视为布尔值。

映射如下(来源):

  • falsey : 空字符串、false、undef
  • 真相:其他一切

在人偶 >=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)