在ruby模板中以定义的顺序循环遍历哈希

时间:2016-09-06 13:29:48

标签: ruby hash puppet erb

我有一个ruby模板(.erb),我想迭代一个哈希。每次木偶代理运行时,它应该生成相同的输出文件。

我目前拥有的是以下内容。这是我的模板(如果有人想知道,则是rsyslog配置的一部分):

<% log_files.each do |log_file, tag| -%>
# <%= log_file %>
$InputFileName <%= log_file %>
$InputFileTag <%= tag %>:

此模板使用如下所示的哈希进行渲染:

log_files => {
  '/root/apache_auth.local' => 'httpd',
  '/root/install.log' => 'hugo',
}, 

(不是真正的日志文件)。这工作并生成我想要的配置文件。这个问题是,每次调用puppet代理时,哈希中日志文件的顺序都会改变,因此配置文件会被重写,随后守护程序会重新启动。功能保持不变,但我不想重写配置文件,每次木偶代理运行时都会重新启动rsyslog。

现在我假设这是哈希无法解决的,因为它们的本质是它们没有定义的顺序。我还有什么其他选择来实现我的目标?

1 个答案:

答案 0 :(得分:2)

由于ERB模板中的scriptlet由Ruby代码组成,因此这本质上是一个Ruby问题。因此,可能的答案取决于您的Puppet目录编译器下运行的Ruby版本。但是,虽然在较新的Ruby中可能有更好的替代方法,但是自Puppet 2.7起,你的代码的这种变化将适用于Puppet支持的任何Ruby:

<% @log_files.sort.each do |log_file, tag| -%>
# <%= log_file %>
$InputFileName <%= log_file %>
$InputFileTag <%= tag %>:
<% end -%>

这里的关键(没有双关语)是sort

相关问题