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

时间:2014-08-12 11:42:37

标签: 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? %>   
    <property>
    <name>yarn.app.mapreduce.am.command-opts</name>
    <value><%= @yarn_app_mapreduce_am_command_opts %></value>
  </property>
<%end %>

根据文档here,最安全的是测试nil。我尝试了几种变体,但没有它们起作用。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

这似乎是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);
}

这会产生:

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: ""'

这个问题已知并且已经discussed at length,但尚未出现可接受的修复方法。使用当前masterpuppet-4分支可以重现此问题。

看来这很难解决,显然你需要一个解决方法。可能性取决于您的数据。

  1. 如果boolean false的值(请注意,这与字符串"false"不同)对于您的密钥是不合理的,您可以将false设为默认值,然后只测试{ {1}}在您的模板中。
  2. 如果空字符串不是合理的值,您可以将其设为默认值,并使用<% if ! @value -%>
  3. 对其进行测试
  4. 最后,您可以围绕hiera函数编写自己的包装器,它会覆盖<% if ! @value.to_s.empty? -%>__KEY_NOT_FOUND__之类的任意默认值。你的旅费可能会改变。请参阅错误报告,了解可能有所帮助的以前工作的一些指示。
  5. 找出其中一个相关错误是否已移至Jira,并在此处留下投票和备注,这仍然是Hiera的问题也可能会有所帮助。