我开始使用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。我尝试了几种变体,但没有它们起作用。
有人可以帮忙吗?
答案 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,但尚未出现可接受的修复方法。使用当前master
和puppet-4
分支可以重现此问题。
看来这很难解决,显然你需要一个解决方法。可能性取决于您的数据。
false
的值(请注意,这与字符串"false"
不同)对于您的密钥是不合理的,您可以将false
设为默认值,然后只测试{ {1}}在您的模板中。<% if ! @value -%>
<% if ! @value.to_s.empty? -%>
到__KEY_NOT_FOUND__
之类的任意默认值。你的旅费可能会改变。请参阅错误报告,了解可能有所帮助的以前工作的一些指示。找出其中一个相关错误是否已移至Jira,并在此处留下投票和备注,这仍然是Hiera的问题也可能会有所帮助。