2

我开始将 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 %>

根据这里的文档,最安全的是在 nil 上进行测试。我尝试了几种变体,但没有一个起作用。

有人可以帮忙吗?

4

1 回答 1

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

这个问题是已知的并且已经被详细讨论过,但是还没有可以接受的解决方案。该问题可通过电流masterpuppet-4分支重现。

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

  1. 如果 boolean 值false(请注意,这与 String 不同"false")对您的键不敏感,您可以false设置默认值并<% if ! @value -%>在模板中进行测试。
  2. 如果空字符串不是一个合理的值,您可以将其设为默认值,并使用<% if ! @value.to_s.empty? -%>
  3. 最后,您可能可以围绕 hiera 函数编写自己的包装器,它会覆盖任意默认值,例如__KEY_NOT_FOUND__to nil。你的旅费可能会改变。请参阅错误报告以获取可能对以前工作有帮助的一些提示。

查明其中一个相关的错误是否已移至Jira并在那里投票并说明这仍然是 Hiera 的一个问题,这也可能会有所帮助。

于 2014-08-12T17:01:24.693 回答