Puppet 处理erb模板中未定义变量的hiera

Puppet 处理erb模板中未定义变量的hiera,puppet,hiera,Puppet,Hiera,我开始对环境或机器特定的变量使用hiera,但当在任何地方都找不到变量时,我面临一个问题。期望的行为是不应该包含在模板中的行为。 我做了以下工作: 在我的舱单代码中 $yarn_app_mapreduce_am_command_opts=hiera('yarn.app.mapreduce.am.command-opts',undef) 在erb模板中,我有: <% if !@yarn_app_mapreduce_am_command_opts.nil? %> <

我开始对环境或机器特定的变量使用hiera,但当在任何地方都找不到变量时,我面临一个问题。期望的行为是不应该包含在模板中的行为。 我做了以下工作: 在我的舱单代码中

$yarn_app_mapreduce_am_command_opts=hiera('yarn.app.mapreduce.am.command-opts',undef) 
在erb模板中,我有:

<% if !@yarn_app_mapreduce_am_command_opts.nil? %>   
    <property>
    <name>yarn.app.mapreduce.am.command-opts</name>
    <value><%= @yarn_app_mapreduce_am_command_opts %></value>
  </property>
<%end %>

warn.app.mapreduce.am.command-opts
根据文件规定,最安全的测试方法是零测试。我尝试了几种变体,但没有一种有效


有人能帮忙吗?

这似乎是hiera()函数的问题。我检查了以下清单

$without_hiera = undef
$with_hiera = hiera('undefined_key', undef)

$no_hiera_template = 'Without Hiera: <% if @without_hiera.nil? %>nil<% else %>not nil: "<%= @without_hiera %>"<% end %>'
$hiera_template = 'With Hiera: <% if @with_hiera.nil? %>nil<% else %>not nil: "<%= @with_hiera %>"<% end %>'

notify {
    'hiera':
        message => inline_template($hiera_template);
    'no_hiera':
        message => inline_template($no_hiera_template);
}
这个问题是众所周知的,而且已经解决了,但是还没有可以接受的解决方案。当前
master
puppet-4
分支可再现该问题

鉴于这将很难解决,您显然需要一个解决方案。可能性取决于您的数据

  • 如果布尔值
    false
    (请注意,这与字符串
    “false”
    )对键不敏感,则可以将
    false
    设为默认值,然后在模板中测试
  • 如果空字符串不是一个合理的值,您可以将其设为默认值,并使用
  • 最后,您可以围绕hiera函数编写自己的包装器,它会覆盖任意默认值,例如
    \uuuuuu KEY\u NOT\u FOUND\uuuu
    nil
    。您的里程可能会有所不同。请参阅bug报告,以获得一些可能有帮助的指向以前工作的指针

  • 找出是否有一个相关的bug被移到了,并在那里留下一个投票和一个注释,说明这仍然是Hiera的一个问题,这可能也会有帮助。

    上述代码的结果是什么?您的主版本是什么?每次都包含属性规范(即使我尝试了相反的逻辑)。使用puppet 3.4.2,但理想情况下,如果可能,我们希望保持与2.7的兼容性。我尝试了几个条件(包括附加的puppet doc的条件),结果是一样的。我找到了各种各样的参考资料,唯一的区别是标记末尾的-%>不确定这是什么意思感谢一个好的答案!作为标记结尾-%%>和%>之间有什么区别吗?顺便说一句:@value.empty?当值在hiera中被定义为一个数字时,在函数为空的意义上,我得到了一个错误,这对我来说不起作用吗?没有定义,说得好!我将修改我的答案,将
    添加到该“模式”中
    
    Notice: Without Hiera: nil
    Notice: /Stage[main]/Main/Notify[no_hiera]/message: defined 'message' as 'Without Hiera: nil'
    Notice: With Hiera: not nil: ""
    Notice: /Stage[main]/Main/Notify[hiera]/message: defined 'message' as 'With Hiera: not nil: ""'