在ruby模板中按照定义的顺序循环散列

我有一个红宝石模板(.erb),我想在一个散列上迭代。 每次puppet代理运行时,它应该产生相同的输出文件。

我目前拥有的是以下内容。 这是我的模板(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代理时,哈希中日志文件的顺序都会改变,因此配置文件会被重写,随后守护进程会重新启动。 功能保持不变,但我宁愿没有重写配置文件,每次puppet代理运行时都会重新启动rsyslog。

现在我认为这是无法用哈希解决的,因为它们的本质是它们没有明确的顺序。 我还有什么其他选择可以实现我想要的?


由于ERB模板中的scriptlet由Ruby代码组成,这实质上是一个Ruby问题。 因此可能的答案取决于哪个版本的Ruby在您的Puppet目录编译器下运行。 但是,尽管在更新的Ruby中可能会有更好的选择,但是您的代码的这种变体可以在Puppet 2.7以后的任何由Puppet支持的Ruby中工作:

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

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

链接地址: http://www.djcxy.com/p/61427.html

上一篇: loop over hash in defined order in ruby template

下一篇: Sorting a YAML output in an ERB template