我有一个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。
现在我假设这是哈希无法解决的,因为它们的本质是它们没有定义的顺序。我还有什么其他选择来实现我的目标?
答案 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
。